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


149

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


32
Autant Python perd sur les benchmarks, gardez à l'esprit que ce ralentissement 50x ou 100x est toujours négatif si le calcul se termine en quelques secondes en Python, et même pas vrai lorsque vous faites beaucoup d'E / S ou que vous avez un algorithme horrible. Plutôt que de demander "à quel point Python est-il plus lent?" vous devriez demander "Python est-il assez rapide?" (et c'est probablement le cas, honnêtement) - c'est aussi plus rapide que l'analyse comparative ou la demande ici.

1
La mise en œuvre d'un algorithme en python est assez rapide et simple ... il vous suffit de le faire et de vérifier ensuite s'il est assez rapide. La plupart du temps, vous pouvez optimiser l'algorithme pour qu'il s'exécute beaucoup plus rapidement en utilisant différentes structures de données (dict / ensembles au lieu de listes ...) ou différentes opérations. Quoi qu'il en soit, l'optimisation devrait avoir lieu après que vous ayez déjà implémenté une première ébauche de l'algorithme et l'aviez évalué / profilé.
Bakuriu

@delnan: dans mon cas, tout est une question de temps de calcul. Si la variante C nécessite x heures de moins, j'investirais ce temps pour laisser les algorithmes fonctionner plus longtemps / à nouveau. Je veux simplement savoir (à peu près) à quel point Python serait plus lent - si ce n'est que quelques heures, je n'utiliserais certainement pas un langage avec lequel je ne suis pas à l'aise (vous pouvez ruiner les meilleures solutions aux problèmes avec de mauvaises implémentations: P).
CrazyFlyingCloseline

@ delnan a raison de dire que Python est probablement assez rapide pour beaucoup de choses. Même lorsqu'il est plus lent, la facilité de développement, de maintenance et d'amélioration future sont des facteurs importants à prendre en compte.
martineau

"x heures"? Quelle est sa taille? Avez-vous évalué une mise en œuvre? Avez-vous des mesures? Avez-vous profilé la mise en œuvre? Ou essayez-vous d'optimiser prématurément la solution?
S.Lott

Réponses:


115

Oui. Regardez Cython . Il fait exactement cela: convertit Python en C pour accélérer.


6
Bien sûr, cela ne vous sauvera rien à moins d'ajouter un tas de cdefdéclarations et d'introduire ainsi un typage statique (sinon vous ne faites que jongler avec des PyObject *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.

7
@delnan: En fait, cela vous fait gagner quelque chose. La plupart du code Python pur sera plus rapide une fois compilé. Mais oui, avec les cdefs et le typage statique, vous commencez vraiment à voir des différences. Et l'interfaçage avec Python que vous obtenez dans tous les cas où vous utilisez C de Python.
Lennart Regebro

136

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

«investir» n'est pas le mot juste ici.

  1. Créez une implémentation fonctionnelle en Python. Vous finirez cela bien avant de terminer une version C.

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

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

Règle de Thompson pour les fabricants de télescopes novices
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.


Institut Bill McKeenan Wang


15
Indépendamment du score énorme, je ne vois pas comment cela répond à la question.
Audrius Meskauskas

29

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


3
+1 un avantage de Shed Skin est l' inférence de type : s'il est possible de deviner les types de variables à partir du flux du programme, la vérification de type dynamique est évitée. Cela conduit généralement à un code C ++ plus court qu'il est en fait possible de lire et de compiler vers des programmes plus rapides.
Kyss Tao

1
Il existe également un transpilateur Python → 11l → C ++ , qui est également un compilateur Python vers C ++ restreint, mais il prend en charge certaines fonctionnalités Python, qui ne sont pas prises en charge avec Shed Skin (par exemple, les fonctions / fermetures imbriquées).
tav

17

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


Ce projet est tellement plus mature que d'autres options similaires. C'est drôle, cela crée le binaire avec une .exeextension 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 pour pyinstaller, py2exe, py2app, etc. Les --recurse-***drapeaux sont importants pour définir correctement cependant.
ccpizza

Nuitka est génial, mais le code C / C ++ créé utilise PyObject qui se lie à l'implémentation CPython-C-code. Il ne produit pas de code C idiomatique.
Make42

8

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 :

Pythran est un compilateur Python vers C ++ pour un sous-ensemble de Python qui inclut une numpyprise en charge partielle . Il agit un peu comme Numba et Cython - vous annotez les arguments d'une fonction, puis il prend le relais avec une annotation de type supplémentaire et une spécialisation du code. Il tire parti des possibilités de vectorisation et des possibilités de parallélisation basées sur OpenMP. Il fonctionne uniquement avec Python 2.7.

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

Dans les coulisses, Pythran prendra à la fois du code Python normal et du code numpy et tentera de les compiler de manière agressive en C ++ très rapide - encore plus rapidement que les résultats de Cython.

Notez que ce projet est jeune et que vous pouvez 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.


6

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.


2
Je sais que c'est un commentaire plus ancien, mais merci!
kfrncs

Pas de problème, je suis content que cela ait été utile.
jacktrader

Quel logiciel utilisez-vous pour compiler à partir de l'interprétation PyPy?
Vasyl Vaskivskyi

Pas spécifiquement PyPy, juste des scripts .py. Nuitka si vous voulez des "exécutables C / C ++ ou code source C / C ++" et PyInstaller si vous voulez juste un exécutable (plus simple). Il y a aussi py2exe mais j'ai eu moins de succès avec lui, même si je suis sûr que les choses se sont améliorées. PyInstaller est également multiplateforme, pas seulement pour les exécutables Windows (fonctionne avec Linux et Mac). Nuitka est unique car je pense que c'est le seul "compilateur" qui vous donne un code source utilisable que vous pourriez en théorie optimiser davantage. Il y en a quelques autres comme bbFreeze, cx_Freeze et py2app mais je ne les ai pas essayés. Bonne chance!
jacktrader

1
J'ai également trouvé que PyPy fonctionnait plus rapidement que Cython. Dans un test, j'ai trouvé que PyPy avait la même vitesse qu'une version C ++ du programme (tri par insertion).
Nv7

5

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


4

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.


1
Il semble que Py2C soit encore un projet inachevé. Il n'a pas été mis à jour depuis quelques années, il est donc possible qu'il soit obsolète.
Anderson Green
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.