Dans quelle mesure serait-il possible de compiler Python (éventuellement via une représentation C intermédiaire) en code machine?
Vraisemblablement, il devrait être lié à une bibliothèque d'exécution Python, et toutes les parties de la bibliothèque standard Python qui étaient elles-mêmes Python devraient également être compilées (et liées).
De plus, vous auriez besoin de regrouper l'interpréteur Python si vous vouliez faire une évaluation dynamique des expressions, mais peut-être qu'un sous-ensemble de Python qui ne le permettait pas serait toujours utile.
Fournirait-il des avantages en termes de vitesse et / ou d'utilisation de la mémoire? Vraisemblablement, le temps de démarrage de l'interpréteur Python serait éliminé (bien que les bibliothèques partagées auraient encore besoin d'être chargées au démarrage).
la source
Réponses:
Essayez le compilateur ShedSkin Python-to-C ++, mais il est loin d'être parfait. Il y a aussi Psyco - Python JIT si seule une accélération est nécessaire. Mais à mon humble avis, cela ne vaut pas la peine. Pour les parties de code critiques pour la vitesse, la meilleure solution serait de les écrire sous forme d'extensions C / C ++.
la source
Comme le dit @Greg Hewgill, il y a de bonnes raisons pour lesquelles ce n'est pas toujours possible. Cependant, certains types de code (comme le code très algorithmique) peuvent être transformés en code machine "réel".
Il existe plusieurs options:
Après cela, vous pouvez utiliser l'un des packages existants (freeze, Py2exe, PyInstaller) pour tout mettre dans un seul binaire.
Dans l'ensemble: il n'y a pas de réponse générale à votre question. Si votre code Python est critique pour les performances, essayez d'utiliser autant de fonctionnalités intégrées que possible (ou posez une question «Comment rendre mon code Python plus rapide»). Si cela ne résout pas le problème, essayez d'identifier le code et portez-le vers C (ou Cython) et utilisez l'extension.
la source
py2c ( https://github.com/pradyun/Py2C ) peut convertir du code python en c / c ++ Je suis le développeur solo de py2c.
la source
PyPy est un projet de réimplémentation de Python en Python, utilisant la compilation en code natif comme l'une des stratégies d'implémentation (les autres étant une VM avec JIT, utilisant JVM, etc.). Leurs versions C compilées fonctionnent plus lentement que CPython en moyenne, mais beaucoup plus rapidement pour certains programmes.
Shedskin est un compilateur expérimental Python vers C ++.
Pyrex est un langage spécialement conçu pour écrire des modules d'extension Python. Il est conçu pour combler le fossé entre le monde agréable, de haut niveau et facile à utiliser de Python et le monde désordonné et de bas niveau de C.
la source
Nuitka est un compilateur Python vers C ++ qui établit des liens avec libpython. Il semble que ce soit un projet relativement nouveau. L'auteur revendique une amélioration de la vitesse par rapport à CPython sur le benchmark pystone.
la source
Cela peut sembler raisonnable à première vue, mais il y a beaucoup de choses ordinaires en Python qui ne sont pas directement mappables à une représentation C sans transporter une grande partie du support d'exécution Python. Par exemple, la frappe de canard vient à l'esprit. De nombreuses fonctions en Python qui lisent des entrées peuvent prendre un fichier ou un objet semblable à un fichier , tant qu'il prend en charge certaines opérations, par exemple. read () ou readline (). Si vous pensez à ce qu'il faudrait pour mapper ce type de support à C, vous commencez à imaginer exactement le genre de choses que le système d'exécution Python fait déjà.
Il existe des utilitaires tels que py2exe qui regrouperont un programme Python et un runtime dans un seul exécutable (dans la mesure du possible).
la source
foo.x
expression ne fonctionnera pas carfoo
elle ne l'aura pasx
au moment où elle est appelée. Existe-t-il des vérificateurs de code statiques pour Python? Python peut être compilé en un assembly .Net ...Pyrex est un sous-ensemble du langage Python qui se compile en C, réalisé par le type qui a d'abord construit des compréhensions de liste pour Python. Il a été principalement développé pour la construction de wrappers mais peut être utilisé dans un contexte plus général. Cython est un fork de pyrex plus activement maintenu.
la source
Quelques références supplémentaires:
https://github.com/dropbox/pyston est un compilateur JIT pour Python développé par Dropbox
http://pythran.readthedocs.io/ est un traducteur python vers C ++ à la compilation pour le calcul scientifique
https://github.com/cosmo-ethz/hope est un traducteur JIT python vers C ++ pour le calcul scientifique
la source
Jython a un compilateur ciblant le bytecode JVM. Le bytecode est entièrement dynamique, tout comme le langage Python lui-même! Très cool. (Oui, comme l'indique la réponse de Greg Hewgill, le bytecode utilise le runtime Jython, et le fichier jar Jython doit donc être distribué avec votre application.)
la source
Psyco est une sorte de compilateur juste à temps (JIT): un compilateur dynamique pour Python, exécute le code 2 à 100 fois plus vite, mais il a besoin de beaucoup de mémoire.
En bref: il exécute votre logiciel Python existant beaucoup plus rapidement, sans changement dans votre source, mais il ne se compile pas en code objet de la même manière qu'un compilateur C.
la source
La réponse est "Oui, c'est possible". Vous pouvez prendre du code Python et tenter de le compiler dans le code C équivalent à l'aide de l'API CPython. En fait, il y avait un projet Python2C qui faisait exactement cela, mais je n'en ai pas entendu parler depuis de nombreuses années (dans le Python 1.5 jours, c'est la dernière fois que je l'ai vu.)
Vous pouvez essayer de traduire le code Python en C natif autant que possible et revenir à l'API CPython lorsque vous avez besoin de fonctionnalités Python réelles. J'ai moi-même joué avec cette idée depuis un mois ou deux. Cependant, c'est énormément de travail, et une énorme quantité de fonctionnalités Python est très difficile à traduire en C: fonctions imbriquées, générateurs, tout sauf des classes simples avec des méthodes simples, tout ce qui implique la modification des globaux de module depuis l'extérieur du module, etc. , etc.
la source
Cela ne compile pas Python en code machine. Mais permet de créer une bibliothèque partagée pour appeler du code Python.
Si ce que vous recherchez est un moyen simple d'exécuter du code Python à partir de C sans vous fier à des éléments execp. Vous pouvez générer une bibliothèque partagée à partir de code python encapsulé avec quelques appels à l' API d'intégration Python . Eh bien, l'application est une bibliothèque partagée, un .so que vous pouvez utiliser dans de nombreuses autres bibliothèques / applications.
Voici un exemple simple qui crée une bibliothèque partagée, que vous pouvez lier avec un programme C. La bibliothèque partagée exécute le code Python.
Le fichier python qui sera exécuté est
pythoncalledfromc.py
:Vous pouvez l'essayer avec
python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')
. Il produira:La bibliothèque partagée sera définie par ce qui suit
callpython.h
:L'associé
callpython.c
est:Vous pouvez le compiler avec la commande suivante:
Créez un fichier nommé
callpythonfromc.c
qui contient les éléments suivants:Compilez-le et exécutez:
Ceci est un exemple très basique. Cela peut fonctionner, mais selon la bibliothèque, il peut être encore difficile de sérialiser les structures de données C vers Python et de Python vers C.Les choses peuvent être quelque peu automatisées ...
Nuitka pourrait être utile.
Il y a aussi numba mais ils ne visent pas tous les deux à faire exactement ce que vous voulez. La génération d'un en-tête C à partir de code Python est possible, mais uniquement si vous spécifiez comment convertir les types Python en types C ou si vous pouvez déduire ces informations. Voir python astroid pour un analyseur Python ast.
la source