Python 3.15 chega com lazy imports, profiler Tachyon e JIT 1,2x mais rápido
O Python 3.15 foi lançado. Os destaques são os imports preguiçosos explícitos (PEP 810), o desempacotamento em comprehensions (PEP 798) e o profiler de amostragem Tachyon, embutido no módulo profiling.sampling. Em velocidade, a versão quase não difere da 3.14, mas o JIT experimental chegou a 1,2x no teste com números de Fibonacci (medição de Miguel Grinberg no 3.15.0rc3). Com a chegada do 3.15, o Python 3.10 perdeu oficialmente o suporte. Para quem mantém bibliotecas, isso significa que a versão mínima pode passar a ser o 3.11. • Os lazy imports reduzem o tempo de inicialização de utilitários de linha de comando (CLI). • O Tachyon substitui profilers externos como o py-spy. • O Python 3.10 não é mais suportado.
Processado por IA de Simon Willison; editado por Hamidun News
O Python 3.15 foi lançado. Para a maioria dos desenvolvedores, três pontos se destacam: os imports preguiçosos (lazy imports) explícitos, o profiler Tachyon na biblioteca padrão e a nova sintaxe de desempacotamento em list comprehensions. A velocidade do interpretador quase não mudou em relação ao 3.14, mas o JIT experimental mostrou pela primeira vez um ganho perceptível: 1,2x. Além disso, o Python 3.10 (2021) perdeu oficialmente o suporte. Para quem mantém bibliotecas, isso pesa mais do que qualquer sintaxe nova: o piso de compatibilidade sobe para o 3.11. O resumo das mudanças para o «What's new» deste ano ficou a cargo de Hugo van Kemenade, release manager das versões 3.14 e 3.15.
Lazy imports, desempacotamento e Tachyon
A novidade mais prática é a PEP 810. Agora é possível declarar um módulo assim: `lazy import json` ou `lazy from pathlib import Path`. O import de fato só acontece no primeiro acesso ao símbolo. O desenvolvedor Simon Willison, autor do utilitário de linha de comando LLM, que tem sistema de plugins, convive com esse problema há tempos. Plugins com dependências pesadas, como `sentence_transformers`, adicionavam vários segundos a cada chamada do comando `llm`. Na documentação para autores de plugins, ele precisava recomendar lazy imports feitos à mão. Agora a própria linguagem resolve isso.
A segunda mudança é a PEP 798, de Adam Hartz e Erik Demaine. Ela adiciona desempacotamento dentro de comprehensions: `[L for L in lists]` transforma uma lista de listas em uma lista plana, `{s for s in sets}` une conjuntos e `{**d for d in dicts}` mescla dicionários. A proposta dá continuidade à PEP 448, que chegou ao Python 3.5 em 2015.
A terceira novidade são os profilers. O `cProfile`, o profiler de tracing que todo mundo conhece, foi renomeado para `profiling.tracing`. Ao lado dele surgiu o `profiling.sampling`, o Tachyon, que usa amostragem. Ele captura periodicamente as pilhas de um processo em execução e calcula onde o tempo é gasto. O overhead é baixo e não é preciso instrumentar o código com antecedência. Até agora, era necessário instalar ferramentas externas como o py-spy para isso. Agora o recurso vem na biblioteca padrão.
No exemplo do resumo de mudanças, o profiler coletou 2 651 amostras em 2,65 segundos, a uma taxa de cerca de 1000 por segundo. O resultado mostra com clareza que o processo passou quase todo o tempo ocioso, esperando o event loop do asyncio. É possível exibir o resultado como flame graph e heat map, além de exportá-lo no formato da interface do Firefox Profiler. No macOS, foi preciso usar `sudo` para se conectar ao processo pelo PID.
Velocidade: o JIT enfim aparece
Não convém esperar aceleração «de graça». Miguel Grinberg comparou o 3.15.0rc3 com o 3.14 e concluiu que o desempenho, em geral, continuou o mesmo. A exceção é o JIT experimental.
- JIT contra o interpretador padrão do 3.15: 1,2x no teste de Fibonacci.
- É a primeira vez que Grinberg vê um ganho significativo com o JIT.
- Para comparação: no ano passado, o 3.14 superou o 3.13 com folga em um número muito maior de categorias.
- Profiler Tachyon: cerca de 1000 amostras por segundo, sem instrumentação prévia.
Como atualizar e o que muda sem o 3.10
Quem usa o `uv` precisa de poucos comandos para migrar. Primeiro, é preciso atualizar a própria ferramenta para que ela reconheça o novo lançamento: `uv self update`. Depois, instala-se o interpretador: `uv python install 3.15`. Para torná-lo a versão padrão em qualquer `uv run` cujo projeto não fixe outra, basta executar `uv python pin --global 3.15`. Para verificar: `uv run python --version`. Utilitários já instalados são reinstalados com a versão desejada, por exemplo `uv tool upgrade datasette --python 3.15`.
Para quem mantém bibliotecas, o lado mais interessante é o inverso. A política de Willison é suportar todas as versões vivas do Python. Como o 3.10 não é mais suportado, já é possível contar com recursos do 3.11:
- `tomllib` na biblioteca padrão;
- `asyncio.TaskGroup` e `asyncio.timeout()`;
- `datetime.UTC` como alias de `datetime.timezone.utc`;
- no `sqlite3`, `setlimit()`/`getlimit()`, `create_window_function()`, `blobopen()` para leitura parcial de BLOBs grandes e `set_authorizer(None)` para remover o autorizador;
- um sistema de tipos bem ampliado.
No Datasette, o primeiro PR (nº 2998) já remove a solução alternativa para `set_authorizer(None)`. Os templates do cookiecutter para click-app, datasette-plugin, python-lib e llm-plugin agora são testados nas versões de 3.11 a 3.15. A conclusão prática para o seu projeto: revise a matriz de CI, remova o 3.10 e adicione o 3.15. Vale testar os lazy imports primeiro em ferramentas de linha de comando com dependências pesadas. Ali, o ganho no tempo de inicialização aparece de imediato.
Access Frontier LLMs & Multimodal AI in One Workspace
Discover NomadNet AI (nomadnet.ai) — unified access to frontier language models, research synthesis, and multimodal workflows.
O essencial da IA — uma vez por semana
Sete histórias que realmente importaram, escolhidas a dedo. Sem ruído nem releases.
Pronto! Verifique seu e-mail para a confirmação.