é possível converter um programa Python para C / C ++?
Preciso implementar alguns algoritmos e não tenho certeza se a diferença de desempenho é grande o suficiente para justificar toda a dor que eu passaria ao fazê-lo em C / C ++ (no qual não sou bom). Pensei em escrever um algoritmo simples e compará-lo com uma solução tão convertida. Se isso por si só for significativamente mais rápido que a versão em Python, não terei outra escolha senão fazê-lo em C / C ++.
c++
python
c
code-generation
CrazyFlyingCloseline
fonte
fonte
Respostas:
Sim. Veja o Cython . Faz exatamente isso: Converte Python em C para acelerações.
fonte
cdef
declarações e, assim, introduza a digitação estática (caso contrário, você apenas manipulaPyObject *
coisas opacas ). E nunca será tão rápido quanto o C simples, porque geralmente faz interface com o Python (100% ou mais? Apenas para código numérico simples que não faz interface com o Python por mais tempo!). Mas, fora isso, sim, você pode obter uma aceleração bastante desviante."investir" não é a palavra certa aqui.
Crie uma implementação funcional em Python. Você terminará isso muito antes de terminar uma versão C.
Avalie o desempenho com o criador de perfil Python. Corrija os problemas que encontrar. Altere as estruturas e algoritmos de dados conforme necessário para realmente fazer isso corretamente. Você terminará isso muito antes de terminar a primeira versão em C.
Se ainda estiver muito lento, traduza manualmente o Python bem projetado e cuidadosamente construído em C.
Devido à maneira como a retrospectiva funciona, a execução da segunda versão do Python existente (com testes de unidade existentes e com dados de criação de perfil existentes) ainda será mais rápida do que tentar executar o código C do zero.
Esta citação é importante.
fonte
Shed Skin é "um compilador (restrito) de Python para C ++".
fonte
Acabei de encontrar essa nova ferramenta nas notícias de hackers.
Da página deles - "Nuitka é um bom substituto para o interpretador Python e compila todas as construções que o CPython 2.6, 2.7, 3.2 e 3.3 oferecem. Ele converte o Python em um programa C ++ que, em seguida, usa" libpython "para executar da mesma maneira que CPython faz, de uma maneira muito compatível. "
fonte
.exe
extensão no OSX, mesmo sendo um executável OSX Mach-O perfeitamente normal. Parece que pode ser um bom substituto parapyinstaller
,py2exe
,py2app
, etc. As--recurse-***
bandeiras são importantes para definir corretamente embora.Outra opção - converter para C ++ além do Shed Skin - é Pythran .
Para citar o High Performance Python de Micha Gorelick e Ian Ozsvald :
fonte
Sei que esse é um tópico mais antigo, mas queria dar informações úteis.
Eu pessoalmente uso o PyPy, que é realmente fácil de instalar usando o pip. Uso de forma intercambiável o interpretador Python / PyPy, não é necessário alterar o código e descobri que é aproximadamente 40x mais rápido que o interpretador python padrão (Python 2x ou 3x). Eu uso o pyCharm Community Edition para gerenciar meu código e adoro isso.
Eu gosto de escrever código em python, pois acho que permite que você se concentre mais na tarefa do que na linguagem, o que é uma grande vantagem para mim. E se você precisar ser ainda mais rápido, poderá sempre compilar em um binário para Windows, Linux ou Mac (não direto, mas possível com outras ferramentas). Pela minha experiência, recebo uma aceleração de cerca de 3,5x no PyPy ao compilar, o que significa 140x mais rápido que o python. O PyPy está disponível para o código Python 3x e 2x e, novamente, se você usar um IDE como o PyCharm, poderá alternar entre digitar PyPy, Cython e Python com muita facilidade (embora leve um pouco de aprendizado e configuração inicial).
Algumas pessoas podem discutir comigo sobre esse assunto, mas acho o PyPy mais rápido que o Cython. Mas ambas são ótimas opções.
Edit: Eu gostaria de fazer outra anotação rápida sobre a compilação: quando você compila, o binário resultante é muito maior que o seu script python, pois cria todas as dependências nele, etc. Mas você obtém alguns benefícios distintos: velocidade! agora o aplicativo funcionará em qualquer máquina (dependendo de qual sistema operacional você compilou, se não todos. lol) sem Python ou bibliotecas, também ofusca seu código e está tecnicamente pronto para "produção" (até certo ponto). Alguns compiladores também geram código C, que eu realmente não olhei ou vi se é útil ou apenas sem sentido. Boa sorte.
Espero que ajude.
fonte
Sei que falta uma resposta sobre uma solução completamente nova. Se o Numpy for usado no código, aconselho a tentar o Pythran:
http://pythran.readthedocs.io/
Para as funções que experimentei, Pythran fornece resultados extremamente bons. As funções resultantes são tão rápidas quanto o código Fortran bem escrito (ou apenas um pouco mais lento) e um pouco mais rápido que a solução (bastante otimizada) Cython.
A vantagem comparada ao Cython é que você só precisa usar o Pythran na função Python otimizada para Numpy, o que significa que você não precisa expandir os loops e adicionar tipos para todas as variáveis no loop. Pythran leva tempo analisando o código para entender as operações
numpy.ndarray
.Também é uma grande vantagem em comparação com o Numba ou outros projetos baseados na compilação just-in-time para a qual (que eu saiba), você precisa expandir os loops para ser realmente eficiente. E então o código com os loops se torna muito ineficiente usando apenas CPython e Numpy ...
Uma desvantagem de Pythran: sem aulas! Mas como apenas as funções que realmente precisam ser otimizadas precisam ser compiladas, isso não é muito irritante.
Outro ponto: Pythran suporta bem (e muito facilmente) o paralelismo OpenMP. Mas não acho que o mpi4py seja suportado ...
fonte
http://code.google.com/p/py2c/ parece uma possibilidade - eles também mencionam em seu site: Cython, Shedskin e RPython e confirmam que estão convertendo o código Python em C / C ++ puro, que é muito mais rápido que o C / C ++ repleto de chamadas à API Python. Nota: Eu não tentei, mas vou ..
fonte