"PyPy es una reimplementación de Python en Python" es una manera bastante engañosa de describir PyPy, en mi humilde opinión, aunque es técnicamente cierto.
Hay dos partes principales de PyPy.
- El marco traducción
- El intérprete
El marco de traducción es un compilador. Compila código de RPython hasta C (u otros destinos), agregando automáticamente aspectos como la recolección de basura y un compilador JIT. Es no puede manejar el código de Python arbitrario, solo RPython.
RPython es un subconjunto de Python normal; todo el código RPython es código Python, pero no al revés. No existe una definición formal de RPython, porque RPython es básicamente solo "el subconjunto de Python que puede ser traducido por el marco de traducción de PyPy". Pero para poder traducir, el código de RPython tiene que ser tipado estáticamente (los tipos se deducen, no los declaras, pero sigue siendo estrictamente un tipo por variable), y no puedes hacer cosas como declarar/modificar funciones/clases en tiempo de ejecución tampoco.
El intérprete es un intérprete de Python normal escrito en RPython.
Dado que el código es el código Python RPython normal, se puede ejecutar en cualquier intérprete de Python. Pero ninguno de los reclamos de velocidad de PyPy provienen de ejecutarlo de esa manera; esto es solo para un ciclo de prueba rápida, porque la traducción del intérprete toma un tiempo largo.
Con ese entendido, debe ser inmediatamente obvio que las especulaciones sobre PyPyPy o PyPyPyPy en realidad no tienen ningún sentido. Tienes un intérprete escrito en RPython. Lo traduce a código C que ejecuta Python rápidamente. Allí el proceso se detiene; no hay más RPython para acelerar procesándolo nuevamente.
Así que "¿Cómo es posible que PyPy a ser más rápido que CPython" también se convierte en bastante obvio. PyPy tiene una mejor implementación, incluido un compilador JIT (en general, no es tan rápido sin el compilador JIT, creo, lo que significa que PyPy solo es más rápido para los programas susceptibles de compilación JIT). CPython nunca fue diseñado para ser una implementación altamente optimizadora del lenguaje Python (aunque sí intentan hacer una implementación altamente optimizada de , si sigue la diferencia).
La parte realmente innovador del proyecto PyPy es que no escriben esquemas sofisticados GC o compiladores JIT con la mano. Ellos escriben el intérprete de forma relativamente sencilla en RPython, por todas RPython es el nivel más bajo que Python es todavía un lenguaje basura recogida orientado a objetos, mucho más alto nivel que C. A continuación, el marco de traducción automática añade cosas como GC y JIT. Por lo que el marco de traducción es una enorme esfuerzo, pero se aplica igualmente bien al intérprete de Python PyPy sin embargo, cambian su aplicación, lo que permite mucha más libertad en la experimentación para mejorar el rendimiento (sin preocuparse de introducir errores GC o actualizar el compilador JIT hacer frente a los cambios). También significa que cuando implementen un intérprete de Python3, obtendrán automáticamente los mismos beneficios. Y cualquier otro intérprete escrito con el framework PyPy (del cual hay un número en diferentes etapas de pulido). Y todos los intérpretes que usan PyPy Framework son compatibles automáticamente con todas las plataformas compatibles con el framework.
Así que el verdadero beneficio del proyecto PyPy es separar (en lo posible) todas las partes de la implementación de un intérprete independiente de la plataforma eficiente para un lenguaje dinámico. Y luego proponga una buena implementación de ellos en un solo lugar, que pueda ser reutilizado en muchos intérpretes. Esa no es una ganancia inmediata como "mi programa Python funciona más rápido ahora", pero es una gran perspectiva para el futuro.
Y puede ejecutar su programa Python más rápido (tal vez).
Nitpick: PyPy * es * PyPyPy. Piense en el prefijo Py- * como operador de proyección. – u0b34a0f6ae
Ok. entonces PyPy debería ser preferible a CPython? ¿Tiene algún inconveniente? – balki
PyPy es excelente en la optimización de tiempo de ejecución, pero sus innards diferentes lo hacen [incompatible] (https://bitbucket.org/pypy/compatibility/wiki/Home) con varias extensiones C populares. –