web-dev-qa-db-fra.com

Convertir le programme Python en code C / C ++?

est-il possible de convertir un programme Python en C/C++?

J'ai besoin d'implémenter quelques algorithmes, et je ne suis pas sûr que l'écart de performances soit suffisamment important pour justifier toute la douleur que je subirais si je le faisais en C/C++ (pour lequel je ne suis pas bon). J'ai envisagé d'écrire un algorithme simple et de le comparer à une telle solution convertie. Si cela seul est nettement plus rapide que la version Python, je n'aurai d'autre choix que de le faire en C/C++.

130

Oui. Regardez Cython . Il ne fait que cela: Convertit Python en C pour accélérer le processus.

97
Lennart Regebro

Si la variante C a besoin de x heures de moins, je passerais ce temps à laisser les algorithmes fonctionner plus longtemps/encore

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

  1. Construire une implémentation de travail en Python. Vous finirez ceci longtemps avant de terminer une version C.

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

  3. S'il est toujours trop lent, traduisez manuellement le CPython bien conçu et construit avec soin en C.

    En raison du fonctionnement rétrospectif, la seconde version à partir de Python existant (avec des tests unitaires existants et des données de profilage existantes) sera toujours plus rapide que d'essayer de créer le code C à partir de zéro.

Cette citation est importante.

règle de Thompson pour les nouveaux constructeurs de télescopes
Il est plus rapide de fabriquer un miroir de quatre pouces, puis un miroir de six pouces, que de fabriquer un miroir de six pouces.

Bill McKeenan
Institut Wang

126
S.Lott

Shed Skin est "un compilateur Python-to-C++ (restreint)".

27
ephemient

Je viens de trouver ceci nouvel outil dans les nouvelles de hacker.

De leur page - "Nuitka remplace bien l’interprète Python et compile chaque construction proposée par CPython 2.6, 2.7, 3.2 et 3.3. Il traduit le Python en un programme C++ qui utilise ensuite "libpython" pour s'exécuter de la même manière que CPython, de manière très compatible. "

14
seagull1089

Une autre option - convertir en C++ sans compter que Shed Skin - est Pythran .

Pour citer Haute performance Python de Micha Gorelick et Ian Ozsvald :

Pythran est un compilateur de Python à C++ pour un sous-ensemble de Python qui inclut une prise en charge partielle de numpy. Cela ressemble un peu à Numba et à Cython: vous annotez les arguments d’une fonction, puis il prend le relais avec une annotation de type et une spécialisation de code supplémentaires. Il tire parti des possibilités de vectorisation et des possibilités de parallélisation basées sur OpenMP. Il fonctionne avec Python 2.7 uniquement.

Une caractéristique très intéressante de Pythran est qu’il tentera de détecter automatiquement les possibilités de parallélisation (par exemple, si vous utilisez un map), et de le transformer en code parallèle sans nécessiter un effort supplémentaire de votre part. Vous pouvez également spécifier des sections parallèles à l'aide de pragma omp> directives; à cet égard, il ressemble beaucoup au support OpenMP de Cython.

En coulisse, Pythran prendra à la fois le code normal Python et le code numpy et tentera de les compiler de manière agressive en C++ très rapide, voire plus rapidement que les résultats de Cython.

Notez que ce projet est jeune et que vous risquez de rencontrer des bugs. vous devez également noter que l'équipe de développement est très sympathique et a tendance à corriger les bogues en quelques heures.

5
boardrider

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

4
ashley

Je me rends compte qu'il manque une réponse à une toute nouvelle solution. 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 d'excellents résultats. Les fonctions résultantes sont aussi rapides que le code Fortran écrit (ou seulement un peu plus lent) et un peu plus rapides que la solution Cython (assez optimisée).

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

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

Un inconvénient de Pythran: pas de cours! Mais comme seules les fonctions qui nécessitent réellement une optimisation doivent être compilées, ce n'est pas très gênant.

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

3
paugier

Je sais que c'est un fil plus ancien, mais je voulais donner ce que je pense être des informations utiles.

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

J'aime écrire du code dans python, car je pense que cela vous permet de vous concentrer davantage sur la tâche que sur le langage, ce qui est un énorme avantage pour moi. Et si vous avez besoin que cela soit encore plus rapide, vous pouvez toujours compiler un binaire pour Windows, Linux ou Mac (pas tout à fait, mais possible avec d’autres outils). D'après mon expérience, je reçois environ 3,5 fois plus rapidement que PyPy lors de la compilation, ce qui signifie 140 fois plus rapide que python. PyPy est disponible pour Python code 3x et 2x et si vous utilisez un IDE comme PyCharm, vous pouvez très facilement échanger entre PyPy, Cython et Python ( prend un peu d’apprentissage initial et de configuration bien).

Certaines personnes peuvent discuter avec moi à ce sujet, mais je trouve que PyPy est plus rapide que Cython. Mais ce sont tous deux d'excellents choix.

Edit: Je voudrais faire une autre remarque rapide sur la compilation: lorsque vous compilez, le fichier binaire obtenu est beaucoup plus volumineux que votre script python car il y crée toutes les dépendances, etc. Mais vous bénéficiez alors de quelques avantages distincts: rapidité !, l’application fonctionnera désormais sur n’importe quelle machine (en fonction du système d’exploitation pour lequel vous avez compilé, sinon de tous. Lol) sans Python ni bibliothèques, elle obscurcit également votre code et est techniquement "production" prêt (à un degré). Certains compilateurs génèrent également du code C, que je n'ai pas encore vraiment cherché à savoir s'il est utile ou simplement du charabia. Bonne chance.

J'espère que ça t'as aidé.

3
jacktrader