264 votes

PyPy--Comment peut on éventuellement battre CPython ?

À partir du Google Open Source de 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 Disponible. De nombreuses années de dur labeur ont finalement payé. Notre vitesse résultats de la souvent battu Disponible, allant d'être un peu plus lent, à la vitesse de 2x sur le réel le code de l'application, à des accélérations allant jusqu'à 10x sur les petits points de référence.

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

(Sur une note... pourquoi serait-on essayer quelque chose comme cela?)

287voto

Ben Points 22160

"PyPy est une ré-implémentation de Python en Python" est un peu trompeuse façon de décrire PyPy, à mon humble avis, même si c'est techniquement vrai.

Il y a deux grandes parties de PyPy.

  1. La traduction du cadre
  2. L'interprète

La traduction est le cadre d'un compilateur. Il compile RPython code en bas à C (ou d'autres objectifs), l'ajout automatique dans des aspects tels que la collecte des ordures et un compilateur JIT. Il ne peut pas gérer arbitraire de code Python, seulement RPython.

RPython est un sous-ensemble de la normale Python; tous les RPython code est le code Python, mais pas l'inverse. Il n'y a pas de définition officielle de RPython, parce que RPython est fondamentalement juste "le sous-ensemble de Python qui peut être traduit par PyPy de la traduction du cadre". Mais pour être traduit, RPython code doit être typé statiquement (les types sont déduits, vous ne déclarez pas, mais c'est toujours strictement un type de variable), et vous ne pouvez pas faire des choses comme la déclaration de/de la modification des fonctions/classes au moment de l'exécution.

L'interprète est alors normal de l'interpréteur Python écrit en RPython.

Parce que RPython code est normal que le code Python, vous pouvez l'exécuter sur n'importe quel interpréteur Python. Mais aucun de PyPy de la vitesse de réclamations proviennent de l'exécution de cette manière; c'est juste pour un test de dépistage rapide du cycle, parce que la traduction de l'interprète prend un long temps.

Avec ce compris, il doit être immédiatement évident que les spéculations sur PyPyPy ou PyPyPyPy ne fait aucun sens. Vous avez un interprète écrit dans RPython. Vous le traduire en code C qui exécute Python rapidement. De là, le processus s'arrête; il n'y a plus RPython pour accélérer la transformation de nouveau.

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


La de vraiment novateur peu de la PyPy projet, c'est qu'ils n'écrivent pas sophistiqué GC régimes ou les compilateurs JIT par la main. Ils écrivent l'interprète relativement simple de le faire dans RPython, et pour tous les RPython est de niveau inférieur à celui de Python c'est toujours orientée objet ordures de la langue, de beaucoup plus haut niveau que C. Ensuite, la traduction du cadre automatiquement ajoute des choses comme le GC et le JIT. Donc la traduction framework est un énorme effort, mais il s'applique aussi bien à la PyPy de l'interpréteur python cependant ils changent leur mise en œuvre, permettant beaucoup plus de liberté dans l'expérimentation pour améliorer les performances (sans se soucier de l'introduction de GC de bugs ou de la mise à jour du compilateur JIT pour faire face aux changements). Il signifie aussi, quand ils se déplacent à la mise en œuvre d'un Python3 interprète, il sera automatiquement obtenir les mêmes avantages. Et tous les autres interprètes écrit avec la PyPy cadre (dont un certain nombre sont à différents stades de polonais). Et tous les interprètes à l'aide de la PyPy cadre automatiquement en charge toutes les plates-formes prises en charge par le framework.

Donc, le véritable avantage de la PyPy projet est de séparer (autant que possible) de toutes les parties de la mise en œuvre efficace de la plate-forme indépendante interpréteur pour un langage dynamique. Et viennent ensuite avec une bonne mise en œuvre en un seul endroit, qui peut être ré-utilisée dans de nombreux interprètes. Ce n'est pas immédiate gagner comme "mon Python programme s'exécute plus vite maintenant", mais c'est un grand espoir pour l'avenir.

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

155voto

Noufal Ibrahim Points 32200

T1. Comment est-ce possible?

Manuel de gestion de la mémoire (ce qui est Disponible ne avec ses de comptage) peut être plus lente que la gestion automatique dans certains cas.

Les Limitations dans la mise en œuvre de la Disponible interprète s'opposent à certaines optimisations que PyPy (eg. une granularité fine des verrous).

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

T2. Qui Python de la mise en œuvre a été utilisé pour mettre en œuvre PyPy?

La PyPy interprète est mis en œuvre dans RPython qui est statiquement typé sous-ensemble de Python (de la langue et non le Disponible interprète). - Se référer https://pypy.readthedocs.org/en/latest/architecture.html pour plus de détails.

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

Cela dépendra de la mise en œuvre de ces interprètes. Si l'un d'eux par exemple pris à la source, a fait une sorte d'analyse sur elle et l'a converti directement dans un objectif spécifique de l'assemblée de code après l'exécution pendant un certain temps, j'imagine que ce serait bien plus rapidement que Disponible.

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

T4. Pourquoi serait-on essayer quelque chose comme cela?

Sur le site officiel. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

Nous visons à fournir:

  • une traduction commune et un cadre de soutien pour la production de
    les implémentations de la dynamique des langues, en mettant l'accent sur nettoyer
    la séparation entre le langage de spécification et de mise en œuvre
    les aspects. Nous appelons cela l' RPython toolchain_.

  • la conformité de la, flexible et rapide de mise en œuvre de la Python_ Langue qui utilise au-dessus de la chaîne de traitement pour permettre de nouvelles avancées de haut niveau de fonctionnalités sans avoir à coder le faible niveau de des détails.

Par séparer les préoccupations de cette façon, la mise en œuvre de Python et d'autres langages dynamiques - est capable de générer automatiquement un Just-in-Time compiler pour n'importe quel langage de programmation dynamique. Il permet également à un mix-and-match approche de mise en œuvre des décisions, y compris de nombreux qui ont été historiquement à l'extérieur de l'utilisateur, tels que plate-forme cible, la mémoire et les modèles de thread, la collecte des ordures des stratégies, et des optimisations appliquées, y compris de savoir si ou de ne pas avoir un JIT dans la première place.

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

23voto

Marcelo Cantos Points 91211

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

La raison de mettre en œuvre PyPy sur le dessus de Python est probablement que c’est simplement une langue très productive, surtout depuis le compilateur JIT rend les performances de la langue d’accueil un peu hors de propos.

11voto

bobpaul Points 181

PyPy est écrit dans Restreinte Python. Il n'est pas exécuté sur le dessus de la Disponible interprète, autant que je sache. Restreint Python est un sous-ensemble du langage Python. Autant que je sache, la PyPy interprète est compilé en code machine, donc une fois installé, il ne veut pas utiliser un interpréteur python au moment de l'exécution.

Votre question semble attendre la PyPy interprète est en cours d'exécution sur le dessus de Disponible lors de l'exécution de code. Edit: Oui, pour utiliser PyPy vous d'abord traduire la PyPy code python, C et construire avec gcc, la jvm du byte-code, ou de .Net CLI code. Voir La Prise En Main

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