Depuis le blog Google Open Source :
PyPy est une réimplémentation de Python en Python, utilisant des techniques avancées pour essayer d'obtenir de meilleures performances que CPython. De nombreuses années de dur labeur ont finalement porté leurs fruits. Nos résultats de vitesse battent souvent CPython, allant d'un peu plus lent, à des accélérations jusqu'à 2x sur le code d'application réel, à des accélérations jusqu'à 10x sur de petits benchmarks.
Comment est-ce possible? Quelle implémentation Python a été utilisée pour implémenter PyPy? CPython ? Et quelles sont les chances qu'un PyPyPy ou PyPyPyPy bat leur score?
(Sur une note connexe ... pourquoi quelqu'un essaierait-il quelque chose comme ça?)
python
pypy
language-implementation
Agnel Kurian
la source
la source
gcc
, après tout. Vous pouvez donc également écrire du code python qui s'exécute sur CPython, qui interprète un autre code python, le traduit en C, et exécutegcc
, puis exécute le programme compilé. Et cela pourrait être plus rapide si le code est appelé assez souvent.Réponses:
Q1. Comment est-ce possible?
La gestion manuelle de la mémoire (ce que fait CPython avec son comptage) peut être plus lente que la gestion automatique dans certains cas.
Des limitations dans l'implémentation de l'interpréteur CPython empêchent certaines optimisations que PyPy peut faire (par exemple, des verrous à grain fin).
Comme Marcelo l'a mentionné, le JIT. Le fait de pouvoir confirmer à la volée le type d'un objet peut vous éviter d'avoir à faire plusieurs déréférences de pointeur pour finalement arriver à la méthode que vous souhaitez appeler.
Q2. Quelle implémentation Python a été utilisée pour implémenter PyPy?
L'interpréteur PyPy est implémenté dans RPython qui est un sous-ensemble statiquement typé de Python (le langage et non l'interpréteur CPython). - Consultez https://pypy.readthedocs.org/en/latest/architecture.html pour plus de détails.
Q3. Et quelles sont les chances qu'un PyPyPy ou PyPyPyPy bat leur score?
Cela dépendrait de la mise en place de ces hypothétiques interprètes. Si l'un d'entre eux, par exemple, a pris la source, a fait une sorte d'analyse sur celui-ci et l'a converti directement en code d'assemblage spécifique cible serré après un certain temps d'exécution, j'imagine que ce serait bien plus rapide que CPython.
Mise à jour: Récemment, sur un exemple soigneusement conçu , PyPy a surpassé un programme C similaire compilé avec
gcc -O3
. C'est un cas artificiel, mais présente quelques idées.Q4. Pourquoi voudrait-on essayer quelque chose comme ça?
Depuis le site officiel. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement
Le compilateur C gcc est implémenté en C, le compilateur Haskell GHC est écrit en Haskell. Avez-vous une raison pour que l'interpréteur / compilateur Python ne soit pas écrit en Python?
la source
"PyPy est une réimplémentation de Python en Python" est une façon assez trompeuse de décrire PyPy, à mon humble avis, bien que ce soit techniquement vrai.
Il y a deux parties principales de PyPy.
Le cadre de traduction est un compilateur. Il compile le code RPython en C (ou d'autres cibles), ajoutant automatiquement des aspects tels que le garbage collection et un compilateur JIT. Il ne peut pas gérer du code Python arbitraire, seulement RPython.
RPython est un sous-ensemble de Python normal; tout le code RPython est du code Python, mais pas l'inverse. Il n'y a pas de définition formelle de RPython, car RPython est fondamentalement juste "le sous-ensemble de Python qui peut être traduit par le cadre de traduction de PyPy". Mais pour être traduit, le code RPython doit être typé statiquement (les types sont inférés, vous ne les déclarez pas, mais c'est toujours strictement un type par variable), et vous ne pouvez pas faire des choses comme déclarer / modifier des fonctions / cours à l'exécution non plus.
L'interpréteur est alors un interpréteur Python normal écrit en RPython.
Le code RPython étant du code Python normal, vous pouvez l'exécuter sur n'importe quel interpréteur Python. Mais aucune des prétentions de vitesse de PyPy ne vient de le faire de cette façon; c'est juste pour un cycle de test rapide, car la traduction de l'interpréteur prend beaucoup de temps.
Cela dit, il devrait être immédiatement évident que les spéculations sur PyPyPy ou PyPyPyPy n'ont en fait aucun sens. Vous avez un interprète écrit en RPython. Vous le traduisez en code C qui exécute Python rapidement. Là, le processus s'arrête; il n'y a plus de RPython à accélérer en le traitant à nouveau.
"Comment est-il possible que PyPy soit plus rapide que CPython" devient également assez évident. PyPy a une meilleure implémentation, y compris un compilateur JIT (ce n'est généralement pas aussi rapide sans le compilateur JIT, je crois, ce qui signifie que PyPy n'est que plus rapide pour les programmes sensibles à la compilation JIT). CPython n'a jamais été conçu pour être une implémentation hautement optimisante du langage Python (bien qu'ils essaient d'en faire une implémentation hautement optimisée , si vous suivez la différence).
La partie vraiment innovante du projet PyPy est qu'ils n'écrivent pas à la main des schémas GC sophistiqués ou des compilateurs JIT. Ils écrivent l'interpréteur relativement directement dans RPython, et pour tous RPython est de niveau inférieur à Python, c'est toujours un langage de récupération de place orienté objet, beaucoup plus haut niveau que C. Ensuite, le cadre de traduction ajoute automatiquement des choses comme GC et JIT. Le cadre de traduction est donc un énormemais cela s'applique également à l'interpréteur python PyPy, mais ils modifient leur implémentation, ce qui permet une plus grande liberté d'expérimentation pour améliorer les performances (sans se soucier de l'introduction de bogues GC ou de la mise à jour du compilateur JIT pour faire face aux changements). Cela signifie également que lorsqu'ils parviendront à implémenter un interpréteur Python3, cela bénéficiera automatiquement des mêmes avantages. Et tout autre interprète écrit avec le framework PyPy (dont il existe un certain nombre à différents stades de polissage). Et tous les interprètes utilisant le framework PyPy prennent automatiquement en charge toutes les plateformes prises en charge par le framework.
Ainsi, le véritable avantage du projet PyPy est de séparer (autant que possible) toutes les parties de la mise en œuvre d'un interprète indépendant de la plate-forme efficace pour un langage dynamique. Et puis en proposer une bonne mise en œuvre en un seul endroit, qui peut être réutilisée par de nombreux interprètes. Ce n'est pas une victoire immédiate comme «mon programme Python s'exécute plus rapidement maintenant», mais c'est une excellente perspective pour l'avenir.
Et il peut exécuter votre programme Python plus rapidement (peut-être).
la source
PyPy est implémenté en Python, mais il implémente un compilateur JIT pour générer du code natif à la volée.
La raison pour implémenter PyPy sur Python est probablement qu'il s'agit simplement d'un langage très productif, d'autant plus que le compilateur JIT rend les performances du langage hôte quelque peu hors de propos.
la source
PyPy est écrit en Python restreint. Il ne fonctionne pas au-dessus de l'interpréteur CPython, pour autant que je sache. Python restreint est un sous-ensemble du langage Python. AFAIK, l'interpréteur PyPy est compilé en code machine, donc lorsqu'il est installé, il n'utilise pas d'interpréteur python au moment de l'exécution.
Votre question semble s'attendre à ce que l'interpréteur PyPy s'exécute sur CPython lors de l'exécution du code. Edit: Oui, pour utiliser PyPy, vous devez d'abord traduire le code python PyPy, soit en C et compilé avec gcc, en code d'octet jvm, soit en code CLI .Net. Voir Mise en route
la source