Principais mudanças no Python 3.13
- O CPython v3.13.0 está previsto para ser lançado em 7 de outubro de 2024
- Esta versão inclui duas mudanças principais que podem ter grande impacto no desempenho do Python
- uma versão "free-threaded" que permite desativar o Global Interpreter Lock (GIL)
- suporte experimental à compilação Just-in-Time (JIT)
Global Interpreter Lock (GIL)
O que é o GIL?
- Python foi projetado e implementado no fim dos anos 1980 por Guido Van Rossum como uma linguagem interpretada de thread única
- Python compila o código-fonte em bytecode e depois o interpretador o executa
- Para acessar objetos com segurança em todas as threads, usa um lock global (GIL)
- é um lock global de exclusão mútua que impede que várias threads executem bytecode ao mesmo tempo
- Isso limita o uso de memória compartilhada, mas é bom para o desempenho em thread única
Por que o Python tem GIL
- No começo dos anos 1990, a maioria dos programas era single-thread e o desempenho de núcleos únicos aumentava rapidamente
- Não havia necessidade de sacrificar o desempenho em thread única por segurança em multithreading
- É possível usar múltiplos processos para aproveitar vários núcleos (módulo
multiprocessing)
Por que remover o GIL agora?
- Os desenvolvedores core do Python queriam remover o GIL há muito tempo, mas isso não avançou por receio de queda no desempenho em thread única
- Com a popularização recente dos processadores multicore, as limitações de multithreading causadas pelo GIL passaram a ser um problema
- O projeto "Faster CPython", patrocinado pela Microsoft, contribuiu para melhorar o desempenho do Python
- Sam Gross propôs uma implementação sem GIL, e a PEP 703 foi adotada
- Plano de adoção gradual: opção experimental → suporte oficial → modo padrão
- Nesse contexto, foi aprovado um plano de remoção gradual do GIL
E o desempenho?
- Ao ativar o free-threading, o desempenho em thread única cai cerca de 20%
- Multithreading com o GIL desativado mostra um ganho de desempenho significativo
- Multithreading com o GIL ativado é mais lento do que thread única
- Multithreading com o GIL desativado apresenta desempenho semelhante ao de multiprocessing
Como usar o Python free-threading?
- Ao instalar o Python 3.13.0rc2t com pyenv, é possível usar a versão free-threading
- Por padrão, o GIL fica desativado, e é possível reativá-lo em runtime com
-X gil=1
- Ao importar um módulo que não oferece suporte a GIL free, o GIL é ativado automaticamente
Compilador JIT (Just-in-Time)
O que é JIT?
- Diferentemente da compilação tradicional ahead-of-time, é uma técnica que gera machine code logo antes da execução
- Antes do Python 3.13, o bytecode era executado convertendo cada instrução em linguagem de máquina, uma por uma
- Com a introdução do JIT, o bytecode pode ser convertido em linguagem de máquina de uma vez só e atualizado quando necessário
- A técnica introduzida no Python 3.13 é o JIT "copy-and-patch", que aplica patches em native code a partir de bytecode correspondente a templates predefinidos
- Compiladores JIT mais avançados podem otimizar áreas "hot" do código que são executadas com frequência
Qual é o impacto do JIT?
- No curto prazo, não deve haver grande mudança na forma de escrever ou executar código Python
- Mas espera-se uma melhoria gradual de desempenho, permitindo competir com outras linguagens
Como usar o JIT?
- No Python 3.13, o JIT é experimental e não vem ativado por padrão
- Pode ser habilitado na compilação com a opção
PYTHON_CONFIGURE_OPTS="--enable-experimental-jit"
- Em runtime, é possível controlar a ativação com
PYTHON_JIT=0/1
Conclusão
- Python 3.13 é um grande lançamento que introduz novos conceitos e recursos interessantes no runtime
- a remoção do GIL e a introdução do JIT sinalizam mudanças importantes
- No curto prazo, talvez não haja grandes mudanças, mas no longo prazo o impacto sobre o desempenho do Python deve ser positivo
- à medida que free-threading e JIT amadurecerem, espera-se um grande impacto no desempenho, especialmente em tarefas CPU-bound
Opinião do GN⁺
- Esta atualização do Python 3.13 parece que vai trazer uma grande mudança para o ecossistema Python. Espera-se que a remoção do GIL alivie gargalos de multithreading e que a introdução do JIT melhore a velocidade geral de execução.
- No entanto, ainda deve levar tempo até que essas mudanças estejam totalmente estabilizadas. Podem surgir problemas de compatibilidade com pacotes existentes, como extensões em C, e novos bugs, como race conditions, podem aparecer na programação multithread.
- A lentidão do Python vinha sendo apontada como uma desvantagem, e espera-se que esta atualização ajude a melhorar essa percepção. Se além da produtividade e da legibilidade que já possui, Python também ganhar velocidade, poderá se tornar uma linguagem ainda mais amplamente usada.
- Ainda assim, existe uma limitação fundamental por ser uma linguagem de tipagem dinâmica. Também será necessário continuar os esforços para incorporar vantagens de linguagens de tipagem estática. Com o uso ativo de recursos introduzidos recentemente no Python, como type hinting e Cython, isso pode ser parcialmente resolvido.
- Em resumo, o Python 3.13 parece trazer mudanças interessantes e positivas. Espera-se que os desenvolvedores entendam bem essas mudanças e as aproveitem para criar programas Python melhores.
3 comentários
Tanto a remoção do GIL quanto o JIT, embora ainda sejam modestos por enquanto, são avanços muito importantes que podem mudar o rumo do Python. É animador pensar no futuro do Python, deixando para trás a fama de “linguagem mais lenta” e sendo usado em ainda mais áreas daqui para frente.
A importância do free threading (remoção do GIL) está bem organizada no PEP 703, junto com as opiniões de várias pessoas.
Além disso, segundo esse PEP, a queda de desempenho em single-thread é de apenas 5~6%, então é difícil aceitar a afirmação, feita nesse texto e em alguns comentários do HN, de que haveria uma queda de 20~50% no desempenho. Também não há nenhuma fonte que permita verificar isso.
Opiniões no Hacker News
Opinião de que remover o GIL deixará programas Python comuns mais lentos e aumentará a complexidade
Reclamação sobre não ser possível baixar uma versão com JIT ativado
Opinião de que isso soa parecido com a rima "Jack and Jill went up the hill"
Experiência de que desativar o garbage collector em programas pequenos, que usam pouca memória e executam por pouco tempo, melhora bastante a velocidade
Opinião de que este é um bom resumo para quem não ficou satisfeito com a explicação dada na primeira discussão sobre a remoção do GIL em 2021
Dúvida sobre se realmente é impossível otimizar o caso sem GIL
Notícia de que a data de lançamento foi alterada de 2 de outubro para 7 de outubro
Opinião de que a perda de desempenho do
nogilfoi citada como 20%, mas pode chegar a até 50%Opinião de que é um título surpreendente
Pergunta procurando um link para trabalhos recentes sobre paralelização automática