est-il possible de convertir un programme Python en C / C ++?
Je dois implémenter quelques algorithmes, et je ne suis pas sûr que l'écart de performance soit suffisamment grand pour justifier toute la douleur que je subirais en le faisant en C / C ++ (ce à quoi je ne suis pas doué). J'ai pensé à écrire un algorithme simple et à le comparer à une telle solution convertie. Si cela seul est nettement plus rapide que la version Python, je n'aurai pas d'autre choix que de le faire en C / C ++.
c++
python
c
code-generation
FouVolantCloseline
la source
la source
Réponses:
Oui. Regardez Cython . Il fait exactement cela: convertit Python en C pour accélérer.
la source
cdef
déclarations et d'introduire ainsi un typage statique (sinon vous ne faites que jongler avec desPyObject *
choses opaques ). Et il ne sera jamais aussi rapide que le C ordinaire car il s'interface généralement avec Python (100% ou plus? Seulement pour le code numérique simple qui ne s'interface pas du tout avec Python pour la plupart du temps!). Mais à part ça, oui, cela peut vous donner une accélération assez dévente.«investir» n'est pas le mot juste ici.
Créez une implémentation fonctionnelle en Python. Vous finirez cela bien avant de terminer une version C.
Mesurez les performances avec le profileur Python. Résolvez tous les problèmes que vous rencontrez. Modifiez les structures de données et les algorithmes si nécessaire pour vraiment le faire correctement. Vous finirez cela bien avant de terminer la première version en C.
S'il est encore trop lent, traduisez manuellement le Python bien conçu et soigneusement construit en C.
En raison de la façon dont fonctionne le recul, faire la deuxième version à partir de Python existant (avec des tests unitaires existants et avec des données de profilage existantes) sera toujours plus rapide que d'essayer de faire le code C à partir de zéro.
Cette citation est importante.
la source
Shed Skin est "un compilateur Python vers C ++ (restreint)".
la source
Je viens de tomber sur ce nouvel outil dans l'actualité des hackers.
De leur page - "Nuitka est un bon remplacement de l'interpréteur 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 le fait, d'une manière très compatible. "
la source
.exe
extension sur OSX même s'il s'agit d'un exécutable OSX Mach-O parfaitement normal. On dirait qu'il pourrait être un bon remplacement pourpyinstaller
,py2exe
,py2app
, etc. Les--recurse-***
drapeaux sont importants pour définir correctement cependant.Une autre option - pour convertir en C ++ en plus de Shed Skin - est Pythran .
Pour citer Python haute performance de Micha Gorelick et Ian Ozsvald :
la source
Je sais que c'est un fil plus ancien, mais je voulais donner ce que je pense être des informations utiles.
J'utilise personnellement PyPy qui est vraiment facile à installer avec pip. J'utilise de manière interchangeable l'interpréteur Python / PyPy, vous n'avez pas du tout besoin de changer votre code et j'ai trouvé qu'il était 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 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 en avez besoin pour être encore plus rapide, vous pouvez toujours compiler vers un binaire pour Windows, Linux ou Mac (pas simple mais possible avec d'autres outils). D'après mon expérience, j'obtiens une accélération d'environ 3,5x sur PyPy lors de la compilation, ce qui signifie 140 fois plus rapide que python. PyPy est disponible pour le code Python 3x et 2x et encore une fois, si vous utilisez un IDE comme PyCharm, vous pouvez échanger très facilement entre PyPy, Cython et Python (cela nécessite un peu d'apprentissage initial et de configuration).
Certaines personnes peuvent discuter avec moi sur celui-ci, mais je trouve que PyPy est plus rapide que Cython. Mais ce sont tous les deux d'excellents choix.
Edit: Je voudrais faire une autre note rapide sur la compilation: lorsque vous compilez, le binaire résultant est beaucoup plus gros que votre script python car il y construit toutes les dépendances, etc. Mais alors vous obtenez quelques avantages distincts: la vitesse !, maintenant, l'application fonctionnera sur n'importe quelle machine (selon le système d'exploitation pour lequel vous avez compilé, sinon tous. lol) sans Python ni bibliothèques, elle obscurcit également votre code et est techniquement prête pour la «production» (dans une certaine mesure). Certains compilateurs génèrent également du code C, que je n'ai pas vraiment regardé ou vu si c'est utile ou juste du charabia. Bonne chance.
J'espère que cela pourra aider.
la source
Je me rends compte qu'il manque une réponse sur une solution toute nouvelle. Si Numpy est utilisé dans le code, je vous 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 du code Fortran bien écrit (ou seulement légèrement plus lent) et un peu plus rapides que la solution Cython (assez optimisée).
L'avantage par rapport à Cython est qu'il vous suffit d'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 de la boucle. Pythran prend son temps pour analyser le code afin de comprendre les opérations sur
numpy.ndarray
.C'est aussi un énorme avantage par rapport à Numba ou à d'autres projets basés sur la compilation juste à temps pour lesquels (à 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 classes! Mais comme 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 pris en charge ...
la source
http://code.google.com/p/py2c/ semble être une possibilité - ils mentionnent également sur leur site: Cython, Shedskin et RPython et confirment qu'ils convertissent le code Python en C / C ++ pur, ce qui est beaucoup plus rapide que C / C ++ criblé d'appels d'API Python. Remarque: je ne l'ai pas essayé mais je vais le faire.
la source