8 pontos por GN⁺ 2024-01-10 | 1 comentários | Compartilhar no WhatsApp

Adição de um compilador JIT ao Python 3.13

  • O desenvolvedor do núcleo do CPython, Brandt Bucher, enviou um pull request para adicionar um compilador JIT ao branch do Python 3.13.
  • Essa mudança será uma das maiores transformações no interpretador CPython desde o interpretador adaptativo especializado adicionado no Python 3.11.

O que é JIT?

  • JIT (Just in Time) é um modelo em que a compilação acontece quando o código é executado pela primeira vez.
  • Um compilador JIT é um compilador que gera código de máquina, em contraste com um compilador AOT (Ahead of Time).
  • O código Python é primeiro compilado em bytecode, e esse bytecode não tem significado direto para a CPU, sendo executado por meio de um loop especial de interpretador de bytecode.

O que é copy-and-patch JIT?

  • Copy-and-patch JIT é um conceito proposto em 2021, projetado como um algoritmo rápido para runtimes de linguagens dinâmicas.
  • A ideia do copy-and-patch JIT é copiar as instruções de cada operação e preencher (fazer o patch de) os argumentos do bytecode.

Vantagens e desvantagens do copy-and-patch JIT

  • Enquanto um compilador JIT "completo" compila bytecode de alto nível em instruções de baixo nível de uma linguagem intermediária (IL), o copy-and-patch JIT faz a compilação de bytecode para código de máquina por meio de um conjunto de templates.
  • O copy-and-patch JIT não precisa executar uma arquitetura complexa de compilador JIT dentro do runtime do Python; basta instalar as ferramentas JIT do LLVM na máquina que compila o CPython a partir do código-fonte.

Como esse JIT funciona?

  • Ele expande a API recém-adicionada à API do Python 3.13 para que otimizadores plugáveis possam ser descobertos em tempo de execução.
  • O novo JIT é um otimizador opcional para essa nova arquitetura.
  • Ao compilar o CPython a partir do código-fonte, fornecer a flag --enable-experimental-jit faz com que sejam gerados templates de código de máquina para o bytecode do Python.

Esse JIT é mais rápido?

  • Os benchmarks iniciais mostram ganhos de desempenho de cerca de 2% a 9%.
  • Esse JIT é a pedra fundamental de uma série de otimizações que podem melhorar significativamente o desempenho do Python.

Opinião do GN⁺

  • O compilador JIT adicionado ao Python 3.13 é uma mudança importante para melhorar a velocidade de execução do Python, especialmente aumentando a eficiência em tarefas repetitivas.
  • O copy-and-patch JIT oferece uma abordagem inovadora para melhorar o desempenho sem precisar integrar uma arquitetura JIT complexa ao runtime de Python do usuário.
  • Espera-se que essa tecnologia gere discussões interessantes na comunidade Python e abra novas possibilidades para a otimização de desempenho da linguagem.

1 comentários

 
GN⁺ 2024-01-10
Comentários do Hacker News
  • O ganho de desempenho de 2–9% entre versões do software é interessante. Essas pequenas melhorias às vezes são vistas com frustração, mas prefiro que elas se acumulem continuamente e façam cada versão ser mais rápida que a anterior.
  • É legal ver a técnica de "copy and patch" de Haoran Xu e Fredrik Kjolstad ganhando destaque. Conheci isso pela primeira vez em um post do blog sobre o projeto de remake do LuaJIT do Xu. Parece uma forma muito inteligente de criar algo novo reaproveitando técnicas existentes. Esse post também é recomendado para quem quiser aprender sobre implementação de linguagens. Além disso, Xu comentou que a demora nas atualizações do blog aconteceu por causa de um retrabalho nos bastidores.
  • Brandt apresentou esse tema no sprint de desenvolvedores core do CPython no ano passado.
  • Apesar do trabalho em PyPy, Jython, GraalPy e IronPython, a adição de um JIT ao CPython é vista como um avanço importante para o ecossistema Python. Especialmente, há expectativa pela evolução após a versão 3.13.
  • Uso Python para tudo, exceto desenvolvimento web, então qualquer melhora de desempenho é muito positiva. O ecossistema Python saiu do modelo de requisições sem estado como CGI ou mod_php e passou para processos de longa duração. Isso significa que é preciso reiniciar ao alterar uma aplicação web local, e alguns desenvolvedores usam formas de reiniciar a aplicação automaticamente ao salvar um arquivo.
  • Lembro que a ideia no CPython era manter a base de código o mais simples possível e deixar as otimizações por conta de outras implementações.
  • O artigo apresenta o JIT de "copy and patch" como algo novo, mas lembro que o QuickBASIC do DOS usava uma abordagem parecida. O QuickBASIC aplicava patches em blocos de assembly modelo na memória e gerava um código assembly muito ruim.
  • O progresso no desempenho do Python nos últimos dois anos é impressionante. A equipe principal tratou o aumento de performance como uma meta séria e conseguiu melhorias visíveis.
  • Gostaria que houvesse mais investimento no PyPy. Mas, em programas pequenos, o tempo de inicialização não é tão bom e eu não vejo grande vantagem. Já em programas grandes, podem surgir problemas complexos de compatibilidade. Se o JIT do CPython for mais confiável ou tiver inicialização mais rápida, isso pode resolver parte desses problemas.
  • A mensagem de PR no repositório do Python no GitHub, parodiando "A Visit from St. Nicholas", é espirituosa.