161 votes

Est-il possible de compiler Python en code machine ?

Dans quelle mesure serait-il possible de compiler Python (éventuellement via une représentation C intermédiaire) en code machine ?

Il devrait probablement être lié à une bibliothèque d'exécution Python, et toutes les parties de la bibliothèque standard Python qui sont elles-mêmes Python devraient être compilées (et liées) également.

De plus, vous devrez regrouper l'interpréteur Python si vous voulez faire une évaluation dynamique des expressions, mais peut-être qu'un sous-ensemble de Python qui ne permet pas cela serait toujours utile.

Cela apporterait-il des avantages en termes de vitesse et/ou d'utilisation de la mémoire ? Le temps de démarrage de l'interpréteur Python serait probablement éliminé (bien que les bibliothèques partagées doivent toujours être chargées au démarrage).

2 votes

Par ailleurs, votre question serait, à mon avis, plus claire si vous demandiez du "code machine" plutôt que du code objet.

0 votes

59voto

Torsten Marek Points 27554

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 "vrai" code machine.

Il existe plusieurs options :

  • Utilisez Psyco qui émet du code machine de manière dynamique. Vous devez cependant choisir avec soin les méthodes/fonctions à convertir.
  • Utilisez Cython qui est un Python- comme qui est compilé dans une extension Python C
  • Utilisez PyPy qui dispose d'un traducteur de RPython (une version sous-ensemble restreint de Python qui ne prend pas en charge certaines des caractéristiques les plus "dynamiques" de Python) à C ou LLVM.
    • PyPy est encore très expérimental
    • toutes les extensions ne seront pas présentes

Après cela, vous pouvez utiliser l'un des paquets existants (freeze, Py2exe, PyInstaller) pour tout mettre dans un seul binaire.

En résumé, il n'y a pas de réponse générale à votre question. Si vous avez du code Python dont les performances sont critiques, essayez d'utiliser autant de fonctionnalités intégrées que possible (ou posez une question du type "Comment rendre mon code Python plus rapide"). Si cela ne vous aide pas, essayez d'identifier le code et de le porter en C (ou Cython) et d'utiliser l'extension.

5 votes

Pypy est le successeur de Psyco.

36voto

cleg Points 2505

Essayez ShedSkin compilateur Python vers C++, mais il est loin d'être parfait. Il y a aussi Psyco - Python JIT si vous avez seulement besoin d'une accélération. Mais, à mon avis, cela ne vaut pas la peine de faire un effort. Pour les parties du code dont la vitesse est critique, la meilleure solution serait de les écrire comme des extensions C/C++.

7 votes

Pour info, ShedSkin a abandonné le support de Windows.

2 votes

@sorin : eh bien, aujourd'hui il supporte Windows ... code.google.com/p/shedskin/downloads/

2 votes

La meilleure solution, en termes de vitesse, pourrait encore être PyPy .

18voto

Ramchandra Apte Points 2739

Py2c ( http://code.google.com/p/py2c ) peut convertir du code python en c/c++. Je suis le développeur solo de py2c.

16voto

pdc Points 1306

PyPy est un projet visant à réimplémenter Python en Python, en utilisant la compilation en code natif comme l'une des stratégies d'implémentation (les autres étant une VM avec JIT, l'utilisation d'une JVM, etc.) Leurs versions C compilées fonctionnent plus lentement que CPython en moyenne, mais beaucoup plus rapidement pour certains programmes.

Peau de vache est un compilateur expérimental Python vers C++.

Pyrex est un langage spécialement conçu pour l'écriture de 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 du C.

3 votes

Cython est la fourche amicale de Pyrex la plus largement utilisée et la plus activement développée.

2 votes

"le monde agréable, de haut niveau et facile à utiliser de Python et le monde désordonné et de bas niveau de C" - c'est drôle, je pensais justement que le C et l'assembleur sont "agréables" et simples, et que Python vit dans le monde "désordonné" et de "haut niveau".

10voto

Pyrex est un sous-ensemble du langage Python qui se compile en C, réalisé par le gars qui a construit le premier compréhensions de listes pour Python. Il a été principalement développé pour construire des wrappers mais peut être utilisé dans un contexte plus général. Cython est une fourchette de pyrex plus activement entretenue.

2 votes

Cython est la fourche amicale de Pyrex la plus largement utilisée et la plus activement développée.

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