Question

De la Google Open Source Blog :

  

PyPy est une ré-implémentation de Python   en Python, en utilisant des techniques avancées   pour essayer d'atteindre de meilleures performances   que CPython. De nombreuses années de dur labeur   ont finalement payé. notre vitesse   résultats souvent battu CPython, allant   d'être légèrement plus lente, à   speedups jusqu'à 2x sur réel   code d'application, à speedups jusqu'à   10x sur de petits points de référence.

Comment est-ce possible? Quelle mise en œuvre Python a été utilisé pour mettre en œuvre PyPy? CPython ? Et quelles sont les chances d'un PyPyPy ou PyPyPyPy battre leur score?

(Sur le même sujet ... pourquoi quelqu'un essayer quelque chose comme ça?)

Était-ce utile?

La solution

Q1. Comment est-ce possible?

gestion de la mémoire manuelle (qui est ce que CPython fait avec son comptage) peut être plus lent que la gestion automatique dans certains cas.

Les limites de la mise en œuvre de l'interprète CPython empêchent certains que Optimisations PyPy peut faire (par exemple. Serrures à grains fins).

Comme Marcelo mentionné, le JIT. Être en mesure de la volée confirmer le type d'un objet peut vous sauver la nécessité de faire déréférence de pointeur multiples pour arriver enfin à la méthode que vous voulez appeler.

Q2. Quelle mise en œuvre Python a été utilisé pour mettre en œuvre PyPy?

L'interprète PyPy est mis en œuvre RPython qui est un sous-ensemble statiquement typé de Python (la langue et non l'interprète CPython). - Reportez-vous https://pypy.readthedocs.org/en/latest/architecture.html pour plus de détails.

Q3. Et quelles sont les chances d'un PyPyPy ou PyPyPyPy battre leur score?

Cela dépend de la mise en œuvre de ces interprètes hypothétiques. Si l'un d'entre eux par exemple pris la source, a fait une sorte d'analyse et convertie directement en code d'assemblage spécifique cible serré après l'exécution pendant un certain temps, je pense qu'il serait tout à fait plus vite que CPython.

Mise à jour: Récemment, sur conçu avec soin, PyPy a surperformé un programme similaire C compilé avec gcc -O3. Il est un cas, mais artificiel ne présente quelques idées.

Q4. Pourquoi quelqu'un essayer quelque chose comme ça?

Sur le site officiel. https://pypy.readthedocs.org/en/latest/architecture.html # mission déclaration

  

Nous visons à fournir:

     
      
  • une traduction et un cadre de soutien à la production
      implémentations de langages dynamiques, mettant l'accent sur une
    propre   la séparation entre les spécifications du langage et de la mise en œuvre
      aspects. Nous appelons cela le RPython toolchain _.

  •   
  • une mise en œuvre conforme, flexible et rapide du Python_   Langue qui utilise l'ensemble des outils ci-dessus pour permettre de nouvelles avancées   de haut niveau comprend sans avoir à coder le faible niveau   détails.

  •   
     

En séparant les préoccupations de cette façon, notre implémentation de Python - et   d'autres langages dynamiques - est capable de générer automatiquement un   compilateur Just-in-Time pour tout langage dynamique. Il permet également   mix-and-match approche des décisions de mise en œuvre, y compris de nombreux   qui ont toujours été en dehors du contrôle d'un utilisateur, par exemple   plate-forme cible, les modèles de mémoire et le filetage, la collecte des ordures   stratégies et optimisations appliquées, y compris ou non   un JIT en premier lieu.

Le gcc compilateur C est implémenté en C, le compilateur Haskell GHC est écrit en Haskell. Avez-vous des raisons de l'interpréteur Python / compilateur de ne pas être écrit en Python?

Autres conseils

« PyPy est une ré-implémentation de Python en Python » est une façon plutôt trompeur de décrire PyPy, à mon humble avis, bien qu'il soit techniquement vrai.

Il y a deux grandes parties de PyPy.

  1. Le cadre de traduction
  2. L'interprète

Le cadre de traduction est un compilateur. Il compile RPython Code jusqu'à C (ou d'autres cibles), en ajoutant automatiquement dans des domaines tels que la collecte des ordures et un compilateur JIT. Il ne peut pas gérer du code Python arbitraire, seulement RPython.

RPython est un sous-ensemble de python normale; tout le code RPython est du code Python, mais pas l'inverse. Il n'y a pas de définition formelle de RPython, parce que 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 statiquement typé (les types sont inférées, vous ne les déclarez pas, mais il est encore strictement un type par variable), et vous ne pouvez pas faire des choses comme déclarant / modifier des fonctions / classes à l'exécution soit.

L'interprète est alors un interpréteur Python écrit normal dans RPython.

Parce que le code est RPython code Python normal, vous pouvez l'exécuter sur un interpréteur Python. Mais aucune des allégations de vitesse de pypy viennent de fonctionner de cette façon; c'est juste pour un cycle de test rapide, parce que la traduction de l'interprète est long temps.

Avec ce compris, il devrait être immédiatement évident que les spéculations sur PyPyPy ou PyPyPyPy ne font pas vraiment de sens. Vous avez un interprète écrit en RPython. Vous traduisez en code C qui exécute Python rapidement. Il arrête le processus; il n'y a pas plus RPython pour accélérer le traitement par nouveau.

« Comment est-il possible pour PyPy être plus rapide que CPython » devient aussi assez évident. PyPy a une meilleure mise en œuvre, y compris un compilateur JIT (il est généralement pas tout à fait aussi vite sans le compilateur JIT, je crois, ce qui signifie PyPy est seulement plus rapide pour les programmes susceptibles de JIT-compilation). CPython n'a jamais été conçu pour être une mise en œuvre très optimisation du langage Python (bien qu'ils essaient de faire une très optimisé mise en œuvre, si vous suivez la différence).


Le bit vraiment innovant du projet PyPy est qu'ils n'écrivent pas sophistiqués systèmes de GC ou compilateurs JIT à la main. Ils écrivent l'interprète relativement carrément dans RPython, et pour tous RPython est plus bas que Python, il est encore une langue recueillie garbage orientée objet, beaucoup plus haut niveau que C. Ensuite, le cadre de traduction automatiquement ajoute des choses comme GC et JIT. Ainsi, le cadre de traduction est un énorme effort, mais il applique aussi bien à l'interpréteur python PyPy mais ils changent leur mise en œuvre, ce qui permet beaucoup plus de liberté dans l'expérimentation pour améliorer les performances (sans se soucier de l'introduction d'insectes GC ou mise à jour du compilateur JIT pour faire face aux changements). Cela signifie aussi quand ils se déplacer à la mise en œuvre d'un interprète python3, il obtiendra automatiquement les mêmes avantages. Et tout autre interprètes écrits avec le cadre PyPy (dont un certain nombre à différentes étapes de polissage). Et tous les interprètes qui utilisent le cadre PyPy prennent automatiquement en charge toutes les plateformes prises en charge par le cadre.

Ainsi, le véritable avantage du projet PyPy est de séparer (autant que possible) toutes les parties de mettre en œuvre un interprète indépendant de la plateforme efficace pour un langage dynamique. Et puis arriver à une bonne mise en œuvre d'entre eux en un seul endroit, qui peut être réutilisé dans de nombreux interprètes. Ce n'est pas une victoire immédiate comme « mon programme Python fonctionne plus vite maintenant », mais il est une grande perspective pour l'avenir.

Et il peut exécuter votre programme Python plus rapide (peut-être).

PyPy est mis en œuvre en Python, mais il met en oeuvre un compilateur JIT pour générer du code natif à la volée.

La raison de mettre en œuvre PyPy au-dessus de Python est sans doute qu'il est tout simplement une langue très productive, d'autant plus que le compilateur JIT rend la performance du langage hôte quelque peu hors de propos.

PyPy est écrit en Python restreint. Il ne fonctionne pas sur le dessus de l'interprète CPython, pour autant que je sache. Restreint Python est un sous-ensemble du langage Python. Autant que je sache, l'interpréteur PyPy est compilé en code machine, donc une fois installé, il n'utilise pas un interpréteur Python à l'exécution.

Votre question semble attendre l'interprète PyPy est en cours d'exécution sur le dessus de CPython lors de l'exécution du code. Modifier Oui, utiliser PyPy vous devez d'abord traduire le code python PyPy, que ce soit à C et à construire avec gcc, à jvm code octet, ou le code .Net CLI. Voir Mise en route

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top