¿Por qué no se incluyó PyPy en Python estándar?

165

Estaba mirando PyPy y me preguntaba por qué no se ha adoptado en las distribuciones principales de Python. ¿Acaso cosas como la compilación JIT y la huella de memoria baja no mejorarían en gran medida las velocidades de todo el código Python?

En resumen, ¿cuáles son los principales inconvenientes de PyPy que hacen que siga siendo un proyecto separado?

KLee1
fuente
44
Además, pypy no tiene soporte para numpy, todavía. morepypy.blogspot.ch/2012/09/numpy-on-pypy-status-update.html
rthiago
Y el soporte numpy solo rasca la superficie de lo que necesitarían las aplicaciones informáticas científicas antes de cambiar a PyPy. Aquí hay algunos pensamientos convincentes del autor numpy original: technicaldiscovery.blogspot.com/2011/10/…
Stuart Berg
3
Creo que estas respuestas y comentarios están desactualizados
Marlon Abeykoon

Respuestas:

249

PyPy no es una bifurcación de CPython, por lo que nunca podría fusionarse directamente en CPython.

Teóricamente, la comunidad Python podría adoptar universalmente PyPy, PyPy podría convertirse en la implementación de referencia y CPython podría descontinuarse. Sin embargo, PyPy tiene sus propias debilidades:

  • CPython es fácil de integrar con los módulos Python escritos en C, que es tradicionalmente la forma en que las aplicaciones Python han manejado las tareas intensivas de la CPU (ver, por ejemplo, el proyecto SciPy).
  • El paso de compilación PyPy JIT en sí mismo cuesta tiempo de CPU: solo es a través de la ejecución repetida de código compilado que se vuelve más rápido en general. Esto significa que los tiempos de inicio pueden ser mayores y, por lo tanto, PyPy no es necesariamente tan eficiente para ejecutar código de pegamento o scripts triviales.
  • El comportamiento de PyPy y CPython no es idéntico en todos los aspectos, especialmente cuando se trata de "detalles de implementación" (comportamiento que no está especificado por el lenguaje pero que aún es importante a nivel práctico).
  • CPython se ejecuta en más arquitecturas que PyPy y se ha adaptado con éxito para ejecutarse en arquitecturas integradas de formas que pueden no ser prácticas para PyPy.
  • Podría decirse que el esquema de conteo de referencia de CPython para la administración de memoria tiene impactos de rendimiento más predecibles que los diversos sistemas GC de PyPy, aunque esto no es necesariamente cierto para todas las estrategias de "GC puro".
  • PyPy aún no es totalmente compatible con Python 3.x, aunque es un elemento de trabajo activo.

PyPy es un gran proyecto, pero la velocidad de tiempo de ejecución en tareas intensivas en CPU no lo es todo, y en muchas aplicaciones es la menor de muchas preocupaciones. Por ejemplo, Django puede ejecutarse en PyPy y eso hace que la creación de plantillas sea más rápida, pero los controladores de la base de datos de CPython son más rápidos que los de PyPy; al final, qué implementación es más eficiente depende de dónde esté el cuello de botella en una aplicación determinada.

Otro ejemplo: pensarías que PyPy sería genial para los juegos, pero la mayoría de las estrategias de GC como las que se usan en PyPy causan una inquietud notable. Para CPython, la mayoría de los juegos intensivos en CPU se descargan en la biblioteca PyGame, que PyPy no puede aprovechar ya que PyGame se implementa principalmente como una extensión C (aunque vea: pygame-cffi). Todavía creo que PyPy puede ser una gran plataforma para juegos, pero nunca lo he visto realmente utilizado.

PyPy y CPython tienen enfoques radicalmente diferentes a las preguntas fundamentales de diseño y realizan diferentes compensaciones, por lo que ninguno es "mejor" que el otro en todos los casos.

Andrew Gorcester
fuente
44
No es cierto que PyPy no sea adecuado para ejecutar scripts. Su tiempo de inicio es prácticamente el mismo que CPython y su velocidad de interpretación es similar.
Lucian
66
Vale la pena señalar que PyPy ahora viene con un GC incremental y, como consecuencia, es potencialmente más adecuado para juegos.
porgarmingduod
63

Por un lado, no es 100% compatible con Python 2.x, y solo tiene soporte preliminar para 3.x.

Tampoco es algo que pueda fusionarse: la implementación de Python que proporciona PyPy se genera utilizando un marco que han creado, que es extremadamente genial, pero también completamente disparejo con la implementación de CPython existente. Tendría que ser un reemplazo completo.

Hay algunas diferencias muy concretas entre PyPy y CPython, una importante es la forma en que se admiten los módulos de extensión , lo que, si desea ir más allá de la biblioteca estándar, es un gran problema.

También vale la pena señalar que PyPy no es universalmente más rápido.

Gareth Latty
fuente
54

Vea este video de Guido van Rossum . Él habla sobre la misma pregunta que usted hizo a los 12 minutos y 33 segundos.

Destacar:

  • falta de compatibilidad con Python 3
  • falta de soporte de extensión
  • no es apropiado como código de cola
  • la velocidad no lo es todo

Después de todo, él es el que decide ...

ninguna
fuente
3
¡+1 para el enlace CON el enlace directo a la parte relevante del video! También +1 para la encuesta informal de Guido van Rossum hilarantemente veraz "¿Cuántas personas están usando PyPy en la producción? ... ¿sin manos? Tose Bueno, supongo que todavía hay esperanza [para CPython]".
Trevor Boyd Smith
15

Una razón podría ser que, según el sitio de PyPy , actualmente solo se ejecuta en la arquitectura Intel x86 de 32 y 64 bits, mientras que CPython también se ejecuta en otras plataformas. Esto probablemente se deba a las mejoras de velocidad específicas de la plataforma en PyPy. Si bien la velocidad es algo bueno, las personas a menudo quieren que las implementaciones de lenguaje sean lo más "independientes de la plataforma" posible.

Bitwise
fuente
66
Tenga en cuenta que un backend ARM está "casi allí" y un backend PowerPC es WIP. También tenga en cuenta que esto solo se refiere al compilador JIT, y portar el JIT a una nueva arquitectura simplemente requiere implementar un generador de código para un IR relativamente simple y de bajo nivel, nada más.
1
A partir de 2018, PyPy ahora se ejecuta en más arquitecturas x86 (32/64 bits en Linunx, Windows, MacOS y BSD), pero también en Linux, hardware ARM más nuevo (ARMv6 o ARMv7, con VFPv3), big-and little-endian variantes de PPC64 y s390x.
Frédéric Grosshans
7

Recomiendo ver esta nota clave de David Beazley para obtener más información. Responde a su pregunta dando claridad sobre la naturaleza y las complejidades de PyPy.

Abhishek Mishra
fuente
6

Además de todo lo que se ha dicho aquí, PyPy no es tan sólido como CPython en términos de errores. Con SymPy, hemos encontrado alrededor de una docena de errores en PyPy en los últimos años, tanto en versiones lanzadas como en los nightlies.

Por otro lado, solo hemos encontrado un error en CPython, y eso fue en una versión preliminar.

Además, no descarte la falta de compatibilidad con Python 3. Ya nadie en la comunidad central de Python se preocupa por Python 2. Están trabajando en las próximas grandes cosas en Python 3.4, que será la quinta versión principal de Python 3. Los chicos de PyPy todavía no han recibido una de ellas. Entonces tienen que ponerse al día antes de que puedan comenzar a ser contendientes.

No me malinterpretes. PyPy es asombroso. Pero aún está lejos de ser mejor que CPython en muchas formas muy importantes.

Y, por cierto, si usa SymPy en PyPy, no verá una huella de memoria más pequeña (o una aceleración tampoco). Ver https://bitbucket.org/pypy/pypy/issues/1447/ .

asmeurer
fuente
2
A partir de 2018, puedo confirmar que he visto aceleraciones de aproximadamente un orden de magnitud en diferentes usos de Sympy
Frédéric Grosshans
1
@ FrédéricGrosshans interesante. Tendré que intentar compararlo nuevamente.
asmeurer