web-dev-qa-db-fra.com

PyPy - Comment peut-il battre CPython?

De la Google Open Source Blog :

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é ses fruits. légèrement plus lent, à des accélérations jusqu'à 2x sur un code d'application réel, à des accélérations jusqu'à 10x sur de petites références.

Comment est-ce possible? Quelle implémentation de Python a été utilisée pour implémenter PyPy? CPython ? Et quelles sont les chances qu’un PyPyPy ou un PyPyPyPy bat son score?

(Sur une note connexe ... pourquoi quelqu'un essaierait-il quelque chose comme ça?)

256
Agnel Kurian

Q1. Comment est-ce possible?

La gestion manuelle de la mémoire (comme le fait CPython) peut être plus lente que la gestion automatique dans certains cas.

Les limitations dans la mise en œuvre de l'interpréteur CPython empêchent certaines optimisations que PyPy peut effectuer (par exemple, des verrous à grain fin).

Comme Marcelo l'a mentionné, le JIT. Être capable de confirmer à la volée le type d'un objet peut vous éviter d'avoir à faire plusieurs déréférences de pointeur pour arriver à la méthode que vous souhaitez appeler.

Q2. Quelle Python a été utilisée pour implémenter PyPy?

L'interpréteur PyPy est implémenté dans RPython, qui est un sous-ensemble de types statiques de Python (le langage et non l'interpréteur CPython). - Refer https://pypy.readthedocs.org/ en/latest/architecture.html pour plus de détails.

Q3. Et quelles sont les chances qu’un PyPyPy ou un PyPyPyPy bat son score?

Cela dépend de la mise en œuvre de ces interprètes hypothétiques. Si l'un d'entre eux, par exemple, prenait le code source, procédait à une analyse et le convertissait directement en code Assembly spécifique à un objectif après un certain temps d'exécution, j'imagine que ce serait beaucoup plus rapide que CPython.

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

Q4. Pourquoi quelqu'un essaierait-il quelque chose comme ceci?

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

Nous visons à fournir:

  • un cadre commun de traduction et de soutien pour la production
    implémentation de langages dynamiques, mettant l'accent sur un environnement propre
    séparation entre spécification linguistique et mise en œuvre
    aspects. Nous appelons cela le RPython toolchain_.

  • une implémentation conforme, flexible et rapide du langage Python_ qui utilise la chaîne d'outils ci-dessus pour permettre de nouvelles fonctionnalités avancées de haut niveau sans avoir à coder les détails de bas niveau.

En séparant les problèmes de cette manière, notre implémentation de Python - et d’autres langages dynamiques - est en mesure de générer automatiquement un compilateur Just-in-Time pour n’importe quel langage dynamique. Elle permet également de combiner - Adaptez votre approche aux décisions d'implémentation, y compris celles qui étaient historiquement hors du contrôle d'un utilisateur, telles que la plate-forme cible, les modèles de mémoire et de threads, les stratégies de récupération de place, et les optimisations appliquées, notamment la création ou non d'une JIT.

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ète/compilateur Python ne soit pas écrit en Python?

154
Noufal Ibrahim

"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.

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

Le cadre de traduction est un compilateur. Il compile le code RPython en C (ou d’autres cibles), en ajoutant automatiquement des aspects tels que la récupération de place et un compilateur JIT. Il ne peut pas gérer arbitrairement Python, uniquement RPython.

RPython est un sous-ensemble de Python normal. tout le code RPython est Python, mais pas l'inverse. Il n'y a pas de définition formelle de RPython, car RPython est essentiellement "le sous-ensemble de Python cela peut être traduit par le framework de traduction de PyPy ". Mais pour être traduit, le code RPython doit être typé de manière statique (les types sont inférés, vous ne les déclarez pas, mais il ne s'agit toujours que d'un type par variable), et vous ne pouvez pas faire des choses comme déclarer/modifier des fonctions/classes au moment de l'exécution.

L’interprète est alors un interpréteur normal Python écrit en RPython.

Le code RPython étant normal Python, vous pouvez l'exécuter sur n'importe quel interpréteur Python. Cependant, aucune des prétentions rapides de PyPy ne provient de son exécution; juste pour un cycle de test rapide, car la traduction de l'interprète prend un temps long .

Ceci compris, il devrait être immédiatement évident que les spéculations sur PyPyPy ou PyPyPyPy n’ont aucun sens. Vous avez un interprète écrit en RPython. Vous le traduisez en code C qui exécute Python rapidement. Le processus s’arrête; il n’ya plus de RPython pour accélérer le traitement.

Donc "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, ce qui signifie que PyPy n’est plus rapide que pour les programmes susceptibles d’être compilés par JIT). CPython n’a jamais été conçu pour être une implémentation hautement optimiste du langage Python (bien qu’ils essaient de le rendre très optimisé ) mise en œuvre, si vous suivez la différence).


Le projet vraiment novateur du projet PyPy est qu’il n’écrit pas à la main des schémas GC complexes ou des compilateurs JIT. Ils écrivent l’interprète de manière relativement simple dans RPython et, pour tous, RPython est de niveau inférieur à Python, il s’agit toujours d’un langage usé orienté objet, beaucoup plus élevé que C. Ensuite, le cadre de traduction automatiquement ajoute des éléments comme GC et JIT. Le cadre de traduction est donc un effort énorme , mais cela s’applique aussi bien à l’interprète PyPy python), mais ils changent d’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 ni de la mise à jour du compilateur JIT pour y faire face. Cela signifie également que lorsqu’ils implémenteront un interpréteur Python3, il obtiendra automatiquement les mêmes avantages, ainsi que pour tout autre interprète écrit avec le framework PyPy (dont il existe un certain nombre à différents stades de la finition). tous les interprètes utilisant le framework PyPy supportent automatiquement toutes les plates-formes supportées par le framework.

Ainsi, le véritable avantage du projet PyPy est de séparer (autant que possible) toutes les étapes de la mise en œuvre d'un interpréteur efficace indépendant de la plate-forme pour un langage dynamique. Et ensuite, proposez-en une bonne implémentation au même endroit, qui pourra être réutilisée par de nombreux interprètes. Ce n'est pas une victoire immédiate comme "mon programme Python est plus rapide maintenant"), mais c'est une excellente perspective pour l'avenir.

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

285
Ben

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

La raison pour laquelle PyPy est implémenté au-dessus de 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.

23
Marcelo Cantos

PyPy est écrit en Python restreint. Il ne fonctionne pas sur l'interpréteur CPython, pour autant que je sache. Restricted Python est un sous-ensemble du Python langage. AFAIK, l’interpréteur PyPy est compilé en code machine. Ainsi, lorsqu’il est installé, il n’utilise pas de python interprète à l’exécution.

Votre question semble s’attendre à ce que l’interprète PyPy s’exécute au-dessus de CPython lorsqu’il exécute du code. Edit: Oui, pour utiliser PyPy, vous traduisez d’abord le code PyPy python, soit en C et construit avec gcc, jvm byte code, ou .Net CLI Code. Voir Mise en route

11
bobpaul