Ir para o conteúdo principal
Voltar aos artigos

Python 3.15: adie imports pesados, não a medição do tempo de inicialização

Imports preguiçosos e profiling por amostragem abrem caminhos de otimização no Python 3.15. A migração deve separar suporte, compatibilidade e desempenho.

·3 min de leitura·2 visualizações

Simon Willison destaca no lançamento do Python 3.15 os imports explicitamente preguiçosos da PEP 810 e o profiler por amostragem Tachyon, disponível como profiling.sampling.[6] Ele também chama atenção para o fim do suporte ao Python 3.10.[6] São duas decisões diferentes para um projeto: revisar a versão mínima suportada e experimentar recursos que podem melhorar um caminho concreto de execução.

O que muda para quem desenvolve

O mecanismo de imports preguiçosos permite adiar o carregamento de um módulo até o primeiro uso de seus símbolos.[6] Willison relaciona o recurso a plugins de seu utilitário LLM, cujas dependências pesadas podiam acrescentar vários segundos mesmo quando a funcionalidade não era necessária.[6]

Minha interpretação é que uma CLI deve pagar pelo trabalho que o comando precisa realizar, não por todo o catálogo de funcionalidades. O alvo inicial seria um subcomando simples que hoje carrega bibliotecas de processamento de dados ou modelos sem utilizá-las. Mas eu avaliaria também o primeiro uso da funcionalidade pesada, para não apresentar como ganho uma espera que apenas mudou de lugar.

O Tachyon coleta periodicamente stacks de processos em execução e pode produzir relatórios, flame graphs e saída compatível com o profiler do Firefox.[6] Isso oferece uma nova opção para investigar onde o programa passa tempo, mas não identifica sozinho qual mudança deve ser feita.

Como aplicar

Crie um ambiente isolado para a versão nova, preservando o interpretador da automação atual. Fixe as dependências e registre quais possuem extensões nativas ou requisitos específicos de versão. Antes de mexer em imports, execute os testes e uma tarefa representativa para estabelecer a referência.

Depois, meça três situações separadas: ajuda da CLI, comando leve e primeiro comando que usa uma dependência pesada. Repita cada situação em processos novos e mantenha consistente a condição de cache. Registre tempo total e falhas, não somente a duração de uma função escolhida.

Ao experimentar carregamento adiado, teste ausência da dependência, erro na inicialização do módulo e descoberta de plugins. Minha proposta de aceite é clara: o comando leve deve melhorar sem tornar os erros da funcionalidade pesada difíceis de entender. Verifique também se a ordem de inicialização prevista continua correta.

Para serviços longos, avalie o profiler sobre carga de homologação e compare o perfil antes e depois da mudança. Evite coletar dados de processos que contenham informação sensível sem revisar o que será capturado e quem terá acesso ao relatório.

Cuidados e limites

Um teste de Miguel Grinberg sobre o release candidate encontrou desempenho próximo ao 3.14; o ganho aproximado de 1,2 vez com JIT veio de um teste de Fibonacci.[6] Isso não demonstra aceleração geral de APIs, bots ou pipelines.

Elevar o mínimo para 3.11 permite usar recursos como tomllib, asyncio.TaskGroup e asyncio.timeout(), conforme o texto de Willison.[6] Ainda assim, eu trataria a compatibilidade dos usuários como parte da decisão. Versão suportada, recurso disponível e ganho medido não são sinônimos.

Fonte

[6] Fonte: Simon Willison

Continue lendo