14 pontos por GN⁺ 2024-09-29 | 3 comentários | Compartilhar no WhatsApp

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

 
ilotoki0804 2024-09-30

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.

 
ilotoki0804 2024-09-30

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.

 
GN⁺ 2024-09-29
Opiniões no Hacker News
  • Opinião de que remover o GIL deixará programas Python comuns mais lentos e aumentará a complexidade

    • Dúvidas sobre quais benefícios reais podem ser obtidos
    • Quando é preciso aproveitar ao máximo vários núcleos de CPU, usar a abordagem de deixar o SO executar várias instâncias do programa e adicionar a lógica de paralelização ao programa
  • Reclamação sobre não ser possível baixar uma versão com JIT ativado

    • Compartilhamento de experiência de que é possível compilar o Python 3.13 manualmente, mas muita gente não tenta e não dá feedback
  • Opinião de que isso soa parecido com a rima "Jack and Jill went up the hill"

    • Havia confusão sobre o que "up the hill" queria dizer
    • Dúvida sobre se o JIT foi lançado, mas o GIL foi realmente removido
  • 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

    • Curiosidade sobre se isso pode ser automatizado
    • Menção ao risco de edge cases em que programas pequenos usam toda a memória
  • 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

    • Opinião de que uma lentidão de 20% é um grande problema
  • Notícia de que a data de lançamento foi alterada de 2 de outubro para 7 de outubro

    • Link relacionado fornecido
  • Opinião de que a perda de desempenho do nogil foi citada como 20%, mas pode chegar a até 50%

    • O JIT não ajuda muito
    • Opinião de que é um lançamento decepcionante que reflete os problemas sociais e corporativos do CPython
    • Alegação de que algumas pessoas prometem recursos, silenciam quem não está 100% entusiasmado e entregam resultados abaixo das expectativas
  • Opinião de que é um título surpreendente

  • Pergunta procurando um link para trabalhos recentes sobre paralelização automática

    • Link fornecido sobre uma abordagem em que se escreve código single-thread e o compilador gera código multithread