Convertir programme en Python de code C/C++?
est-il possible de convertir un programme en Python pour C/C++?
J'ai besoin de mettre en œuvre quelques algorithmes, et je ne suis pas sûr si l'écart de performance est assez grand pour justifier toute la douleur que j'irais quand le faire en C/C++ (que je ne suis pas très bonne). J'ai pensé à écrire un algorithme simple et de référence contre une telle solution de conversion. Si cela seul est nettement plus rapide que la version de Python, je n'ai pas d'autre choix que de le faire en C/C++.
- Autant que Python perd sur des points de référence, gardez à l'esprit que 50x ou 100x ralentissement est encore negible si le calcul se termine en quelques secondes en Python, et même pas vrai lorsque vous faites beaucoup d'I/O, ou d'avoir un horrible algorithme. Plutôt que de demander "comment, beaucoup plus lente, Python?" vous devriez demander "est Python assez vite?" (et plus probablement est, honnêtement) - qui est également plus rapide que l'analyse comparative ou de demander ici.
- L'implémentation d'un algorithme en python est assez rapide et simple...il vous suffit de le faire et de vérifier ensuite si elle est assez rapide. La plupart du temps, vous pouvez optimiser la l'algorithme pour courir beaucoup plus vite à l'aide de différentes structures de données(dict/sets au lieu de listes...) ou d'opérations différentes. De toute façon l'optimisation après vous avez déjà mis en place une première version de l'algorithme et comparées/profilés elle.
- dans mon cas, il est tout au sujet de temps de calcul. Si la variante C x heures de moins, alors je vous investir ce temps de laisser les algorithmes de courir plus longtemps encore. Je veux simplement savoir (à peu près) comment beaucoup plus lent Python serait - il si c'est juste une couple d'heures, je ne voudrais certainement pas utiliser une langue que je ne suis pas à l'aise avec (vous pouvez ruiner la meilleure des solutions à des problèmes avec de mauvaises implémentations :P).
- juste à propos de Python sans doute d'être assez rapide pour beaucoup de choses. Même quand il est plus lent, la facilité de devleopment, la maintenance et la mise en valeur future sont des facteurs importants à considérer.
- "les x heures"? Quelle est la taille de cette? Avez-vous comparé à une mise en œuvre? Avez-vous des mesures? Avez-vous dressé le portrait de la mise en œuvre? Ou essayez-vous d'prématurément optimiser la solution?
Vous devez vous connecter pour publier un commentaire.
Oui. Regardez Cython. Il est là pour ça: Convertit Python à C pour les accélérations.
cdef
déclarations et ainsi introduire le typage statique (sinon vous suffit de jongler opaquePyObject *
genre de trucs). Et il ne sera jamais aussi rapide que du C parce que c'est généralement l'interfaçage avec Python (100% ou plus? seulement pour le code numérique qui n'a pas d'interface avec Python à tous pour la plupart du temps!). Mais à part ça, oui, il peut vous obtenir un joli devent speedup."investir" n'est-ce pas le bon mot ici.
Construire une implémentation en Python. Vous allez finir cette longue avant de vous terminer une version en C.
Mesure de la performance avec le Python profiler. Résoudre les problèmes que vous trouvez. Changer les structures de données et algorithmes nécessaires pour vraiment faire cela correctement. Vous allez finir cette longue avant de terminer la première version en C.
Si c'est encore trop lent, de traduire manuellement le bien-conçu et construit avec soin Python dans C.
En raison de la façon rétrospective des œuvres, en faisant la deuxième version de l'existante Python (avec l'existant, les tests unitaires, et avec l'existant de profilage de données) sera toujours plus rapide que d'essayer de faire le code C à partir de zéro.
Cette citation est importante.
Hangar De La Peau est "un (restreint) Python-à-compilateur C++".
Vient de partout cette nouvel outil de hacker news.
À partir de leur page "Nuitka est un bon remplacement pour l'interpréteur Python et compile tous les construction Disponible 2.6, 2.7, 3.2 et 3.3 de l'offre. 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."
.exe
extension sur OSX, même si c'est parfaitement normal OSX Mach-O executable. Regarde comme il pourrait être un bon remplacement pourpyinstaller
,py2exe
,py2app
, etc. Le--recurse-***
drapeaux sont importants pour définir correctement malgré tout.Une autre option - pour convertir en C++ d'ailleurs Hangar de la Peau - est Pythran.
Pour citer Haute Performance Python par Micha Gorelick et Ian Ozsvald:
http://code.google.com/p/py2c/ ressemble à une possibilité - ils également mentionner sur leur site: Cython, Shedskin et RPython et de confirmer qu'ils sont en train de convertir le code Python pur C/C++ qui est beaucoup plus rapide que le C/C++ criblé de Python appels d'API. Note: je n'ai pas essayé, mais je vais..
Je sais que c'est un vieux thread mais je voulais donner ce que je pense être des informations utiles.
Personnellement, j'utilise PyPy qui est très facile à installer à l'aide du pep. Je indifféremment utiliser Python/PyPy interprète, vous n'avez pas besoin de changer votre code et je l'ai trouvé à peu près 40 fois plus rapide que la norme de l'interpréteur python (Python 2 ou 3 fois). J'utilise pyCharm Community Edition pour gérer mon code et je l'aime.
J'aime l'écriture de code en python car je pense qu'il vous permet de vous concentrer plus sur la tâche de la langue, 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 (pas droit devant, mais possible avec d'autres outils). De mon expérience, je reçois environ 3,5 x de l'accélération de plus de PyPy lors de la compilation, sens 140x plus rapide que python. PyPy est disponible pour Python 3 fois et 2 fois le code et encore si vous utilisez un IDE comme PyCharm vous pouvez les échanges entre dire PyPy, Cython, et Python très facilement (il prend un peu de formation initiale, le programme d'installation si).
Certaines personnes peuvent discuter avec moi sur ce point, mais je trouve que PyPy être plus rapide que Cython. Mais ils sont tous les deux d'excellents choix si.
Edit: je voudrais faire une autre note rapide sur la compilation: lors de la compilation, le binaire résultant est beaucoup plus grand que votre script python, car il s'inspire de toutes les dépendances en elle, etc. Mais ensuite, vous obtenez quelques avantages distincts: la vitesse!, maintenant, l'application fonctionnera sur n'importe quelle machine (en fonction de l'OS que vous avez compilé pour, si ce n'est tous. lol) sans Python ou les bibliothèques, il a également dissimule votre code et est techniquement la "production" prêt (à un degré). Certains compilateurs également de générer du code C, que je n'ai pas vraiment regardé ou voir si c'est utile ou juste du charabia. Bonne chance.
Espère que ça aide.
Je me rends compte qu'une réponse à une nouvelle solution est manquant. Si Numpy est utilisé dans le code, je voudrais des conseils pour essayer Pythran:
http://pythran.readthedocs.io/
Pour les fonctions que j'ai essayé, Pythran donne de très bons résultats. Les fonctions qui en résulte sont aussi vite que bien écrit, code Fortran (ou seulement légèrement plus lente) et un peu plus vite que les (très optimisé) Cython solution.
L'avantage par rapport à Cython est que vous avez juste à utiliser Pythran sur la fonction Python optimisé pour Numpy, ce qui signifie que vous n'avez pas à développer les boucles et ajouter des types pour toutes les variables dans la boucle. Pythran prend son temps pour analyser le code de sorte qu'il comprend les opérations sur
numpy.ndarray
.C'est aussi un énorme avantage par rapport à Numba ou d'autres projets sur la base de juste-à-temps de compilation pour qui (à ma connaissance), vous devez développer les boucles pour être réellement efficace. Et puis le code avec la boucle devient très très inefficace en utilisant uniquement Disponible et Numpy...
Un inconvénient de Pythran: pas de cours! Mais depuis que les seules fonctions qui ont vraiment besoin d'être optimisé doit être compilé, il n'est pas très gênant.
Un autre point: Pythran soutient le bien (et très facilement) OpenMP parallélisme. Mais je ne pense pas que mpi4py est pris en charge...