Converter programa Python em código C / C ++? [fechadas]


149

é 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 ++.


32
Por mais que o Python perca nos benchmarks, lembre-se de que a desaceleração de 50x ou 100x ainda é negativa se o cálculo for concluído em alguns segundos no Python, e nem verdade quando você faz muita E / S ou tem um algoritmo horrível. Em vez de perguntar "quanto mais lento é o Python?" você deve perguntar "o Python é rápido o suficiente?" (e é mais provável que seja, honestamente) - isso também é mais rápido do que comparações ou perguntas aqui.

1
A implementação de um algoritmo em python é bastante rápida e direta ... você simplesmente precisa fazer isso e verificar se é rápido o suficiente. Na maioria das vezes, você pode otimizar o algoritmo para executar muito mais rapidamente usando estruturas de dados diferentes (dict / sets em vez de listas ...) ou operações diferentes. De qualquer forma, a otimização deve ocorrer depois que você já implementou um primeiro rascunho do algoritmo e o comparou / perfilou.
Bakuriu 10/01/11

@ delnan: no meu caso, é tudo sobre tempo de computação. Se a variante C precisar de x horas a menos, investirei esse tempo para permitir que os algoritmos funcionassem mais / novamente. Eu simplesmente quero descobrir (aproximadamente) quanto mais lento o Python seria - se fosse apenas algumas horas, certamente não usaria uma linguagem com a qual não me sinto confortável (você pode arruinar as melhores soluções para problemas com implementações ruins: P)
precisa saber é o seguinte

O @ delnan está certo sobre o Python provavelmente ser rápido o suficiente para muitas coisas. Mesmo quando mais lento, a facilidade de desenvolvimento, manutenção e aprimoramento futuro são fatores importantes a serem considerados.
martineau

"x horas"? Quão grande é isso? Você comparou uma implementação? Você tem medidas? Você definiu o perfil da implementação? Ou você está tentando otimizar prematuramente a solução?
S.Lott

Respostas:


115

Sim. Veja o Cython . Faz exatamente isso: Converte Python em C para acelerações.


6
É claro que isso não salvará nada, a menos que você adicione várias cdefdeclarações e, assim, introduza a digitação estática (caso contrário, você apenas manipula PyObject *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.

7
@ delnan: De fato, você economiza algo. O código Python mais puro será mais rápido depois da compilação. Mas sim, com o cdefs e a digitação estática, você realmente começa a ver diferenças. E a interface com o Python é obtida em todos os casos em que você usa C do Python.
Lennart Regebro

136

Se a variante C precisar de x horas a menos, investirei esse tempo para permitir que os algoritmos rodassem mais / mais

"investir" não é a palavra certa aqui.

  1. Crie uma implementação funcional em Python. Você terminará isso muito antes de terminar uma versão C.

  2. 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.

  3. 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.

A regra de Thompson para os fabricantes de telescópios iniciantes
É mais rápido fazer um espelho de dez centímetros e depois um espelho de quinze centímetros do que um espelho de dez centímetros.


Instituto Bill McKeenan Wang


15
Independentemente da pontuação tremenda, não vejo como isso responde à pergunta.
Audrius Meskauskas 25/03/19

29

Shed Skin é "um compilador (restrito) de Python para C ++".


3
+1 Uma vantagem do Shed Skin é a inferência de tipo : se for possível adivinhar tipos de variáveis ​​a partir do fluxo do programa, a verificação dinâmica de tipo é evitada. Isso normalmente leva a um código C ++ mais curto que é realmente possível ler e compilar em programas mais rápidos.
Kyss Tao

1
Há também o transpilador Python → 11l → C ++ , que também é um Python restrito ao compilador C ++, mas suporta alguns recursos do Python, que não são suportados pelo Shed Skin (por exemplo, funções / fechamentos aninhados).
TAV

17

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. "


Este projeto é muito mais maduro do que outras opções semelhantes. É engraçado que ele crie o binário com uma .exeextensão no OSX, mesmo sendo um executável OSX Mach-O perfeitamente normal. Parece que pode ser um bom substituto para pyinstaller, py2exe, py2app, etc. As --recurse-***bandeiras são importantes para definir corretamente embora.
Ccpizza

Nuitka é ótimo, mas o código C / C ++ criado está usando PyObject, que se vincula à implementação do código CPython-C-code. Não produz código C idiomático.
Make42 15/03

8

Outra opção - converter para C ++ além do Shed Skin - é Pythran .

Para citar o High Performance Python de Micha Gorelick e Ian Ozsvald :

Pythran é um compilador Python para C ++ para um subconjunto de Python que inclui numpysuporte parcial . Ele funciona de maneira semelhante ao Numba e Cython - você anota os argumentos de uma função e assume a anotação de tipo e a especialização de código. Ele tira proveito das possibilidades de vetorização e das possibilidades de paralelização baseadas em OpenMP. É executado usando apenas o Python 2.7.

Uma característica muito interessante do Pythran é que ele tentará detectar automaticamente oportunidades de paralelização (por exemplo, se você estiver usando a map), e transformar isso em código paralelo sem exigir esforço extra de você. Você também pode especificar seções paralelas usando pragma omp > diretivas; Nesse aspecto, parece muito semelhante ao suporte OpenMP do Cython.

Nos bastidores, o Pythran pega o código normal do Python e o numpy e tenta compilá-los agressivamente em C ++ muito rápido - ainda mais rápido que os resultados do Cython.

Você deve observar que este projeto é jovem e poderá encontrar erros; você também deve observar que a equipe de desenvolvimento é muito amigável e tende a corrigir erros em questão de horas.


6

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.


2
Eu sei que este é um comentário antigo, mas obrigado!
kfrncs 29/03/19

Não tem problema, estou feliz que tenha sido útil.
jacktrader

Qual software você usa para compilar a partir da interpretação do PyPy?
Vasyl Vaskivskyi 9/10/19

Não especificamente PyPy, apenas scripts .py. Nuitka, se você deseja "código executável do C / C ++ ou código-fonte do C / C ++" e PyInstaller, se você quiser apenas um executável (mais fácil). Há também py2exe, mas tive menos sucesso com ele, embora tenha certeza de que as coisas melhoraram. O PyInstaller também é multiplataforma, não apenas para executáveis ​​do Windows (funciona com Linux e Mac). Nuitka é único, porque acho que é o único "compilador" que fornece código-fonte utilizável que, em teoria, você poderia otimizar ainda mais. Existem alguns outros como bbFreeze, cx_Freeze e py2app, mas ainda não os experimentei. Boa sorte!
jacktrader

1
Eu também achei o PyPy rodando mais rápido que o Cython. Em um teste, na verdade, achei o PyPy a mesma velocidade que uma versão C ++ do programa (tipo de inserção).
Nv7

5

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 ...


4

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 ..


1
Parece que o Py2C ainda é um projeto inacabado. Ele não é atualizado há alguns anos, portanto pode estar desativado.
Anderson Green
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.