J'ai beaucoup entendu parler du projet PyPy . Ils affirment qu'il est 6,3 fois plus rapide que l' interpréteur CPython sur leur site .
Chaque fois que nous parlons de langages dynamiques comme Python, la vitesse est l'un des principaux problèmes. Pour résoudre ce problème, ils disent que PyPy est 6,3 fois plus rapide.
Le deuxième problème est le parallélisme, le fameux Global Interpreter Lock (GIL). Pour cela, PyPy dit qu'il peut donner du Python sans GIL .
Si PyPy peut résoudre ces grands défis, quelles sont ses faiblesses qui empêchent une adoption plus large? Autrement dit, qu'est-ce qui empêche quelqu'un comme moi, un développeur typique de Python, de passer à PyPy en ce moment ?
Réponses:
PyPy ne prend pas en charge numpyPyPy prend désormais en charge numpy . Certaines extensions ne sont toujours pas prises en charge (Pandas, SciPy, etc.), consultez la liste des packages pris en charge avant d'effectuer la modification.est expérimental pour le moment.vient d'arriver stable! Depuis le 20 juin 2014, PyPy3 2.3.1 - Fulcrum est sorti !Ce sont les principales raisons qui me touchent, je dirais.
la source
np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)
?) En Python et cela rend Python très approprié pour la communauté scientifique. De plus, faire les parties non intensives en Python et décortiquer en C pour les petites boucles intensives est une stratégie courante et utilisable.Ce site ne prétend pas que PyPy est 6,3 fois plus rapide que CPython. Citer:
Il s'agit d'une déclaration très différente de la déclaration générale que vous avez faite, et lorsque vous comprendrez la différence, vous comprendrez au moins un ensemble de raisons pour lesquelles vous ne pouvez pas simplement dire «utiliser PyPy». Cela peut sembler comme si je me moquais, mais comprendre pourquoi ces deux déclarations sont totalement différentes est vital.
Pour décomposer cela:
La déclaration qu'ils font ne s'applique qu'aux références qu'ils ont utilisées. Il ne dit absolument rien sur votre programme (à moins que votre programme soit exactement le même que l'un de leurs points de référence).
La déclaration concerne une moyenne d'un groupe de repères. Il n'y a aucune prétention que l'exécution de PyPy donnera une amélioration de 6,3 fois même pour les programmes qu'ils ont testés.
Il ne prétend pas que PyPy va même exécuter tous les programmes qui CPython fonctionne tout , et encore moins vite.
la source
Parce que pypy n'est pas compatible à 100%, prend 8 Go de RAM à compiler, est une cible mobile et très expérimentale, où cpython est stable, la cible par défaut pour les constructeurs de modules pendant 2 décennies (y compris les extensions c qui ne fonctionnent pas sur pypy ), et déjà largement déployé.
Pypy ne sera probablement jamais l'implémentation de référence, mais c'est un bon outil à avoir.
la source
La deuxième question est plus facile à répondre: vous pouvez essentiellement utiliser PyPy comme remplacement de remplacement si tout votre code est purement Python. Cependant, de nombreuses bibliothèques largement utilisées (dont certaines de la bibliothèque standard) sont écrites en C et compilées en tant qu'extensions Python. Certains d'entre eux peuvent être conçus pour fonctionner avec PyPy, d'autres non. PyPy fournit le même outil "orienté vers l'avant" que Python --- c'est-à-dire que c'est Python --- mais ses entrailles sont différentes, donc les outils qui s'interfacent avec ces entrailles ne fonctionneront pas.
Quant à la première question, j'imagine que c'est une sorte de Catch-22 avec la première: PyPy a évolué rapidement dans un effort pour améliorer la vitesse et améliorer l'interopérabilité avec d'autres codes. Cela l'a rendu plus expérimental qu'officiel.
Je pense qu'il est possible que si PyPy entre dans un état stable, il puisse commencer à être plus largement utilisé. Je pense également que ce serait formidable pour Python de s'éloigner de ses fondements C. Mais cela n'arrivera pas avant un moment. PyPy n'a pas encore atteint la masse critique où il est presque assez utile pour faire tout ce que vous voulez, ce qui motiverait les gens à combler les lacunes.
la source
J'ai fait un petit benchmark sur ce sujet. Bien que la plupart des autres affiches aient fait de bons points sur la compatibilité, mon expérience a été que PyPy n'est pas beaucoup plus rapide pour se déplacer uniquement sur les bits. Pour de nombreuses utilisations de Python, il n'existe vraiment que pour traduire des bits entre deux ou plusieurs services. Par exemple, peu d'applications Web effectuent des analyses gourmandes en CPU des jeux de données. Au lieu de cela, ils prennent quelques octets d'un client, les stockent dans une sorte de base de données, puis les renvoient à d'autres clients. Parfois, le format des données est modifié.
Le BDFL et les développeurs CPython sont un groupe de personnes remarquablement intelligent et ont réussi à aider CPython à exceller dans un tel scénario. Voici une fiche de blog sans vergogne: http://www.hydrogen18.com/blog/unpickling-buffers.html . J'utilise Stackless, qui est dérivé de CPython et conserve l'interface complète du module C. Je n'ai trouvé aucun avantage à utiliser PyPy dans ce cas.
la source
Q: Si PyPy peut résoudre ces grands défis (vitesse, consommation de mémoire, parallélisme) par rapport à CPython, quelles sont ses faiblesses qui empêchent une adoption plus large?
R: Premièrement, il y a peu de preuves que l'équipe PyPy peut résoudre le problème de vitesse en général . Des preuves à long terme montrent que PyPy exécute certains codes Python plus lentement que CPython et cet inconvénient semble être profondément enraciné dans PyPy.
Deuxièmement, la version actuelle de PyPy consomme beaucoup plus de mémoire que CPython dans un ensemble assez large de cas. PyPy n'a donc pas encore résolu le problème de consommation de mémoire.
Que PyPy résout les grands défis mentionnés et sera en général plus rapide, moins gourmand en mémoire et plus convivial pour le parallélisme que CPython est une question ouverte qui ne peut pas être résolue à court terme. Certaines personnes parient que PyPy ne sera jamais en mesure de proposer une solution générale lui permettant de dominer CPython 2.7 et 3.3 dans tous les cas.
Si PyPy réussit à être meilleur que CPython en général, ce qui est discutable, la principale faiblesse affectant son adoption plus large sera sa compatibilité avec CPython. Il existe également des problèmes tels que le fait que CPython s'exécute sur une plus large gamme de processeurs et de systèmes d'exploitation, mais ces problèmes sont beaucoup moins importants par rapport aux performances de PyPy et aux objectifs de compatibilité CPython.
Q: Pourquoi ne puis-je pas supprimer le remplacement de CPython par PyPy maintenant?
R: PyPy n'est pas 100% compatible avec CPython car il ne simule pas CPython sous le capot. Certains programmes peuvent toujours dépendre des fonctionnalités uniques de CPython qui sont absentes dans PyPy telles que les liaisons C, les implémentations C de l'objet et des méthodes Python, ou la nature incrémentielle du garbage collector de CPython.
la source
CPython a un comptage de référence et une récupération de place, PyPy a uniquement une récupération de place.
Les objets ont donc tendance à être supprimés plus tôt et
__del__
sont appelés de manière plus prévisible dans CPython. Certains logiciels dépendent de ce comportement, ils ne sont donc pas prêts à migrer vers PyPy.Certains autres logiciels fonctionnent avec les deux, mais utilisent moins de mémoire avec CPython, car les objets inutilisés sont libérés plus tôt. (Je n'ai pas de mesures pour indiquer son importance et quels autres détails d'implémentation affectent l'utilisation de la mémoire.)
la source
__del__
être appelé tôt ou pas du tout est faux, même en CPython. Comme vous le dites, cela fonctionne généralement et certaines personnes pensent que c'est garanti. Si quelque chose qui fait référence à l'objet est rattrapé dans un cycle de référence (ce qui est plutôt facile - saviez-vous que l'inspection de l'exception actuelle d'une certaine manière non artificielle crée un cycle de référence?) La finalisation est retardée indéfiniment, jusqu'au cycle suivant GC (qui peut ne jamais l' être ). Si l'objet fait lui-même partie d'un cycle de référence,__del__
il ne sera pas appelé du tout (avant Python 3.4).Pour beaucoup de projets, il y a en fait 0% de différence entre les différents pythons en termes de vitesse. Ce sont ceux qui sont dominés par le temps d'ingénierie et où tous les pythons ont la même quantité de support de bibliothèque.
la source
Pour faire simple: PyPy fournit la vitesse qui manque à CPython mais sacrifie sa compatibilité. La plupart des gens, cependant, choisissent Python pour sa flexibilité et sa fonctionnalité "batterie incluse" (haute compatibilité), pas pour sa vitesse (il est quand même préféré).
la source
J'ai trouvé des exemples, où PyPy est plus lent que Python. Mais: uniquement sous Windows.
Donc, si vous pensez à PyPy, oubliez Windows. Sous Linux, vous pouvez réaliser des accélérations impressionnantes. Exemple (liste tous les nombres premiers entre 1 et 1 000 000):
Cela s'exécute 10 (!) Fois plus vite sur PyPy que sur Python. Mais pas sur les fenêtres. Là, il n'est que 3 fois plus rapide.
la source
PyPy a pris en charge Python 3 depuis un certain temps, mais selon ce post HackerNoon d'Anthony Shaw du 2 avril 2018 , PyPy3 est encore plusieurs fois plus lent que PyPy (Python 2).
Pour de nombreux calculs scientifiques, en particulier les calculs matriciels, numpy est un meilleur choix (voir FAQ: Dois-je installer numpy ou numpypy? ).
Pypy ne prend pas en charge gmpy2. Vous pouvez plutôt utiliser gmpy_cffi même si je n'ai pas testé sa vitesse et que le projet a eu une version en 2014.
Pour les problèmes de Project Euler, j'utilise fréquemment PyPy, et pour de simples calculs numériques, c'est souvent
from __future__ import division
suffisant pour mes besoins, mais la prise en charge de Python 3 est toujours en cours de travail à partir de 2018, avec votre meilleur pari étant sur Linux 64 bits. Windows PyPy3.5 v6.0, le dernier en date de décembre 2018, est en version bêta.la source
Versions Python prises en charge
Pour citer le Zen de Python :
Par exemple, Python 3.7 a introduit les classes de données et Python 3.8 a introduit fstring = .
Il pourrait y avoir d'autres fonctionnalités dans Python 3.7 et Python 3.8 qui sont plus importantes pour vous. Le fait est que PyPy ne prend pas en charge Python 3.7 ou Python 3.8 pour le moment.
la source