Convertir le programme Python en code C / C++? [fermé]

est-il possible de convertir un programme Python en c/" class="blnk">C/C++?

j'ai besoin d'implémenter quelques algorithmes, et je ne suis pas sûr que l'écart de performance soit assez grand pour justifier toute la douleur que je traverserais en le faisant en C/C++ (ce à quoi je ne suis pas bon). J'ai pensé à écrire un algorithme simple et le comparer avec une telle solution convertie. Si cela seul est significativement plus rapide que la version Python, alors je n'aurai pas d'autre choix que de le faire en C/C++.

102
demandé sur Aaron Hall 2011-01-10 21:46:12

8 réponses

Oui. Regardez Cython . Il ne fait que cela: convertit Python en C pour des speedups.

83
répondu Lennart Regebro 2011-01-10 18:56:18

si la variante C nécessite x heures de moins, alors j'investirais ce temps en laissant les algorithmes fonctionner plus longtemps /à nouveau

"investir" n'est pas le mot juste ici.

  1. construisez une implémentation de travail en Python. Tu finiras ça bien avant de finir une version C.

  2. mesurer la performance avec le profileur Python. Résoudre les problèmes que vous trouvez. Changer les structures de données et les algorithmes si nécessaire pour vraiment le faire correctement. Vous finirez ceci bien avant de finir la première version en C.

  3. si c'est encore trop lent, traduisez manuellement le Python bien conçu et soigneusement construit en C.

    en raison de la façon dont le recul fonctionne, faire la deuxième version à partir de Python existant (avec des tests unitaires existants, et avec des données de profilage existantes) sera encore plus rapide que essayer de faire le code C à partir de zéro.

Cette citation est importante.

règle de Thompson pour les premiers fabricants de télescopes

Il est plus rapide de faire un quatre dans le miroir, puis un six-pouces miroir que de faire un six-pouces miroir.

Le Projet De Loi McKeenan

Wang Institute

111
répondu S.Lott 2013-09-23 06:59:32

Hangar de la Peau est "un (restreint) Python-à-compilateur C++".

26
répondu ephemient 2011-01-10 19:08:16

vient de partout ce nouvel outil de hacker news.

de leur page - " Nuitka est un bon remplacement pour l'interpréteur Python et compile toutes les constructions que les Cpythons 2.6, 2.7, 3.2 et 3.3 offrent. Il traduit le Python dans un programme C++ qui utilise ensuite "libpython" pour exécuter de la même manière que Disponible, dans un très compatible."

12
répondu seagull1089 2014-05-05 18:08:36

une autre option - pour convertir en C++ outre peau de hangar - est Pythran .

citer Haute Performance Python par Micha Gorelick et Ian Ozsvald :

Pythran est un compilateur Python-to-C++ pour un sous-ensemble de Python qui comprend le soutien partiel numpy . Il agit un peu comme engourdissement et Cython-vous annotez les arguments d'une fonction, et puis il prend le dessus avec plus d'annotation de type et de spécialisation de code. Il faut avantages des possibilités de vectorisation et de L'OpenMP-based possibilités de parallélisation. Il fonctionne avec Python 2.7 seulement.

une caractéristique très intéressante de Pythran est qu'il tentera de repérer automatiquement les possibilités de parallélisation (p. ex., si vous êtes utiliser un map ), et le transformer en code parallèle sans exiger de l'effort de vous. Vous pouvez également spécifier sections parallèles utilisant les directives pragma omp >; à cet égard, il semble très similaire à Cython Support OpenMP.

dans les coulisses, Pythran prendra à la fois le code Python normal et le code num pythy et essayer de les compiler agressivement en C++très rapide-même plus rapide que les résultats de Cython.

Vous devriez noter que ce projet est jeune, et vous pouvez rencontrer bugs; vous devriez également noter que l'équipe de développement sont très amical et ont tendance à corriger les bogues en quelques heures.

5
répondu boardrider 2016-04-19 12:30:00

http://code.google.com/p/py2c / ressemble à une possibilité - ils mentionnent également sur leur site: Cython, Shedskin et RPython et confirment qu'ils convertissent du code Python en C/C++ pur qui est beaucoup plus rapide que C/c++ criblé d'appels D'API Python. Note: je n'ai pas essayé, mais je vais..

4
répondu ashley 2014-03-05 11:25:50

je me rends compte qu'une réponse sur une solution tout à fait nouvelle est manquante. Si Numpy est utilisé dans le code, je conseillerais D'essayer Pythran:

http://pythran.readthedocs.io /

pour les fonctions que j'ai essayées, Pythran donne de très bons résultats. Les fonctions résultantes sont aussi rapides que le code Fortran écrit (ou seulement légèrement plus lent) et un peu plus rapide que la solution Cython (assez optimisée).

L'avantage par rapport à Cython est que vous avez juste à utiliser Pythran sur la fonction Python optimisée pour Numpy, ce qui signifie que vous n'avez pas à étendre les boucles et ajouter des types pour toutes les variables dans la boucle. Pythran prend son temps pour analyser le code afin de comprendre les opérations sur numpy.ndarray .

il est également un énorme avantage par rapport à Numba ou d'autres projets basés sur la compilation juste-à-temps pour lequel (à ma connaissance), vous devez étendre les boucles pour être vraiment efficace. Et puis le code avec les boucles devient très inefficace en utilisant seulement CPython et Numpy...

un inconvénient de Pythran: pas de classe! Mais puisque seules les fonctions qui ont vraiment besoin d'être optimisées doivent être compilées, ce n'est pas très ennuyeux.

autre point: Pythran supporte bien (et très facilement) le parallélisme OpenMP. Mais je ne pense pas que mpi4py soit supporté...

3
répondu paugier 2017-10-27 10:46:02

je sais que c'est un vieux thread mais je voulais donner ce que je pense être des informations utiles.

j'utilise personnellement PyPy qui est vraiment facile à installer en utilisant pip. J'utilise indifféremment l'interpréteur Python/PyPy, vous n'avez pas besoin de changer votre code du tout et je l'ai trouvé à environ 40x plus rapide que l'interpréteur python standard (soit Python 2x ou 3x). J'utilise pyCharm Community Edition pour gérer mon code et je l'adore.

j'aime écrire du code en python car je pense qu'il vous permet de vous concentrer davantage sur la tâche que sur le langage, ce qui est un énorme plus pour moi. Et si vous en avez besoin pour être encore plus rapide, vous pouvez toujours compiler des binaires pour Windows, Linux, ou Mac. D'après mon expérience, j'ai une vitesse d'environ 3,5 x sur PyPy lors de la compilation, ce qui signifie 140x plus rapide que python. PyPy est disponible pour le code Python 3x et 2x et de nouveau si vous utilisez un IDE comme PyCharm vous pouvez échanger entre PyPy, Cython, et Python très facilement (prend un peu de apprentissage initial).

certaines personnes peuvent se disputer avec moi sur celui-ci, mais je trouve que PyPy est plus rapide que Cython. Ils sont tous les deux d'excellents choix.

Edit: j'aimerais faire une autre petite remarque sur la compilation: lorsque vous compilez, le binaire résultant est beaucoup plus grand que votre script python car il construit toutes les dépendances en lui, etc. Mais alors vous obtenez quelques avantages distincts: vitesse!, maintenant, l'application fonctionnera sur n'importe quelle machine (selon le système D'exploitation pour lequel vous avez compilé, si ce n'est la totalité. lol) sans Python ni bibliothèques, Il obscurcit également votre code et est techniquement prêt pour la "production". Certains compilateurs génèrent aussi du code C, que je n'ai pas vraiment regardé ou vu si c'est utile ou juste du charabia. Bonne chance.

Espère que ça aide.

2
répondu jacktrader 2016-05-12 16:13:04