Python tem a vantagem de ser muito usado em IA, análise de dados etc. e permitir programar rapidamente, mas o problema crônico de lentidão das linguagens interpretadas também costuma causar dor de cabeça no trabalho real.
Na prática, várias alternativas são consideradas para melhorar o problema de velocidade do Python. Há casos em que o código Python é usado apenas como protótipo inicial e, ao migrar para produção, é redesenvolvido em Rust ou C/C++.
Estou desenvolvendo experimentalmente uma ferramenta chamada Rextio como uma nova alternativa para resolver o problema de velocidade sem abandonar o Python.
O conceito básico é aumentar o desempenho convertendo automaticamente para código Rust e compilando para binário as partes do código Python que podem ser transformadas em nativo (como código estático com type hints), enquanto as partes difíceis de converter automaticamente para nativo (como código dinâmico) permanecem como código Python (fallback) e são executadas pelo CPython, preservando a lógica do código Python original.
Em linhas gerais, é o seguinte.
Projeto Python com tipos definidos
-> análise de candidatos a native compatíveis
-> funções inseguras ou não compatíveis são rejeitadas
-> funções aceitas geram Rust + PyO3
-> o restante gera wrappers de fallback em Python
-> build de artefato compatível com import
Para mais detalhes, consulte a documentação no repositório Git do link.
Ao comparar a execução incluindo o binário native convertido com o Rextio com a execução do código Python original no CPython, também é possível verificar ganhos de desempenho.
- Ao converter código Python básico para native e executar: 57,73×
- Ao converter NumPy para native e executar: 2,52×
- Ao converter NetworkX para native e executar o algoritmo de Dijkstra: 3,68×
- Ao converter
Series.mapdo pandas para native e executar: 66,14× - Ao converter PyTorch deep MLP para native e executar: 1,02× (ganho de velocidade limitado porque o pacote Python existente usa extensões em C etc.)
- Ao converter TensorFlow eager chain para native e executar: 1,04× (ganho de velocidade limitado porque o pacote Python existente usa extensões em C etc.)
Para o código-fonte usado no benchmark que produziu os resultados acima e as informações do ambiente de execução, consulte o rextio-benchmark Git repository.
Como referência, o Rextio tem uma Core CLI que converte código Python e executa a compilação, e estou desenvolvendo a possibilidade de acoplar plugins adicionais que definem regras para converter pacotes Python individuais em código Rust. Atualmente já criei alguns plugins para NumPy etc. (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow etc.), e os resultados de benchmark acima foram obtidos usando esses plugins.
É claro que o Rextio ainda é um projeto inicial com muito a melhorar, e compilar código Python para native baseado em Rust não traz ganho de desempenho em todas as situações.
Por exemplo, se houver troca frequente de dados entre a parte native e a parte de fallback em CPython, pode ocorrer até uma redução de velocidade, porque os dados são convertidos e atravessam a fronteira. Ainda assim, nesses casos, o Rextio procura induzir essa parte a fazer fallback inteiramente para CPython, sem passar por native, para evitar a queda de desempenho.
Depois de desenvolver sozinho por um tempo, achei que o projeto já tinha tomado forma em certa medida e por isso o apresento aqui.
Se tiverem perguntas, opiniões ou feedback, farei o possível para responder e incorporar.
Obrigado.
Ainda não há comentários.