225 votes

Convertir un 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 performance soit suffisamment important pour justifier tout le mal que je me donnerais en le faisant en C/C++ (ce que je ne sais pas faire). J'ai pensé écrire un algorithme simple et le comparer à une telle solution convertie. Si cette seule solution est significativement plus rapide que la version Python, alors je n'aurai pas d'autre choix que de le faire en C/C++.

54 votes

Même si Python perd sur les benchmarks, gardez à l'esprit que ce ralentissement de 50x ou 100x est toujours négligeable si le calcul se termine en quelques secondes en Python, et n'est même pas vrai si vous faites beaucoup d'E/S ou si vous avez un algorithme horrible. Plutôt que de demander "combien Python est plus lent ?", vous devriez demander "Python est-il assez rapide ?". (et il l'est très probablement, honnêtement) - c'est aussi plus rapide que de faire un benchmark ou de demander ici.

4 votes

L'implémentation d'un algorithme en python est assez rapide et directe... il suffit de le faire et de vérifier s'il est assez rapide. La plupart du temps, vous pouvez optimiser l'algorithme pour fonctionner beaucoup plus rapidement en utilisant des structures de données différentes (dict/sets au lieu de listes...) ou des opérations différentes. Quoi qu'il en soit, l'optimisation doit se faire après vous avez déjà mis en œuvre une première version de l'algorithme et l'avez étalonnée/profilée.

0 votes

@delnan : dans mon cas, tout est question de temps de calcul. Si la variante C nécessite x heures de moins, alors j'investirai ce temps pour laisser les algorithmes s'exécuter plus longtemps/encore. Je veux simplement savoir (approximativement) combien 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 (on peut ruiner les meilleures solutions aux problèmes avec de mauvaises implémentations :P).

174voto

S.Lott Points 207588

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

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

  1. Construire une implémentation fonctionnelle en Python. Vous terminerez cela bien avant de terminer une version C.

  2. Mesurer les performances avec le profileur Python. Corrigez les problèmes que vous trouvez. Modifiez les structures de données et les algorithmes si nécessaire pour vraiment faire cela correctement. Vous aurez terminé ce travail bien avant de terminer la première version en C.

  3. Si c'est toujours 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 les tests unitaires existants, et avec les 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 règle de Thompson pour les constructeurs de télescopes débutants
Il est plus rapide de faire un miroir de quatre pouces, puis un miroir de six pouces, que de faire un miroir de six pouces.

Bill McKeenan
Institut Wang

71 votes

Indépendamment de l'énorme score, je ne vois pas en quoi cela répond à la question.

9 votes

@Audrius Meskauskas, il ne le fait pas, il l'évite, rendant inutile la prémisse même de la question. En d'autres termes, elle explique comment faire quelque chose de mieux que ce qui a été demandé, au lieu de ce qui a été demandé.

5 votes

Quant à moi, je l'aurais upvoted pour la citation à la fin, seulement. C'est extrêmement perspicace, quand on l'extrapole à la programmation en C. Je suis au milieu d'une implémentation de fast_malloc() en C. J'en suis à 4 semaines d'un projet que je pensais prendre quelques jours. La majorité de mon temps a été consacrée à la structure de support du code, et non au code lui-même. Si l'objectif est de construire une cabane, la plupart de mes efforts sont consacrés à la fabrication des clous, du marteau, de la scie et des produits chimiques nécessaires à la fabrication de la peinture, afin que je puisse ensuite fabriquer le pot dans lequel mélanger la peinture, ainsi que le bâton de peinture, puis la peinture.

152voto

Lennart Regebro Points 52510

Oui. Regardez Cython . C'est exactement ce qu'il fait : Convertir Python en C pour gagner en vitesse.

11 votes

Bien sûr, cela ne vous fera pas économiser quoi que ce soit, à moins que vous n'ajoutiez un tas de cdef et ainsi introduire le typage statique (sinon, vous jonglez avec des déclarations opaques de PyObject * ). Et il ne sera jamais aussi rapide que le simple C parce qu'il est généralement interfacé avec Python (100% ou plus ? seulement pour le code numérique simple qui n'est pas du tout interfacé avec Python la plupart du temps !) Mais à part cela, oui, il peut vous procurer un gain de vitesse assez important.

9 votes

@delnan : En fait, cela vous fait gagner quelque chose. La plupart du code Python pur sera plus rapide après avoir été compilé. Mais oui, avec les cdefs et le typage statique, vous commencez vraiment à voir des différences. Et l'interface avec Python que vous obtenez dans tous les cas où vous utilisez C à partir de Python.

34voto

ephemient Points 87003

Se débarrasser de la peau est "un compilateur (restreint) Python vers C++".

4 votes

inférence de type : s'il est possible de deviner les types des variables à partir du flux du programme, la vérification dynamique des types est évitée. Cela conduit généralement à un code C++ plus court, qu'il est réellement possible de lire et qui se compile en programmes plus rapides.

1 votes

Il existe également Transpilateur C++ de Python 11l Shed Skin, qui est également un compilateur Python vers C++ restreint, mais qui supporte certaines fonctionnalités de Python, qui ne sont pas supportées par Shed Skin (par exemple, les fonctions/fermetures imbriquées).

27voto

seagull1089 Points 21

Je viens de tomber sur ce nouvel outil dans les actualités des hackers.

Extrait de leur page - "Nuitka est un bon remplacement de l'interpréteur Python et compile toutes les constructions offertes 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 façon très compatible."

2 votes

Ce projet est tellement plus mature que d'autres options similaires. C'est amusant qu'il crée le binaire avec un .exe sur OSX alors qu'il s'agit d'un exécutable Mach-O OSX parfaitement normal. On dirait qu'il pourrait être un bon remplacement de pyinstaller , py2exe , py2app etc. Le site --recurse-*** Les drapeaux sont cependant importants à mettre en place correctement.

3 votes

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

7voto

ashley Points 55

http://code.google.com/p/py2c/ Cela semble être une possibilité - ils le mentionnent également sur leur site : Cython, Shedskin et RPython et confirment qu'ils convertissent du code Python en C/C++ pur, ce qui est beaucoup plus rapide que du C/C++ truffé d'appels d'API Python. Note : Je ne l'ai pas encore essayé mais je vais le faire

2 votes

Il semble que Py2C soit toujours un projet inachevé. Il n'a pas été mis à jour depuis quelques années, il pourrait donc être défunt.

0 votes

@ashley Toujours très utile, merci - ça peut être un bon alt. Solution, merci d'avoir posté ceci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X