"PyPy es una reimplementación de Python en Python" es una forma bastante engañosa de describir PyPy, en mi humilde opinión, aunque es técnicamente cierto.
Hay dos partes principales de PyPy.
- El marco de traducción
- El interprete
El marco de traducción es un compilador. Compila el código RPython hasta C (u otros objetivos), agregando automáticamente aspectos como la recolección de basura y un compilador JIT. No puede manejar código arbitrario de Python, 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 "el subconjunto de Python que puede ser traducido por el marco de traducción de PyPy". Pero para ser traducido, el código RPython tiene que estar estáticamente escrito (los tipos se infieren, 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 normal de Python escrito en RPython.
Debido a que el código RPython es código Python normal, puede ejecutarlo en cualquier intérprete de Python. Pero ninguno de los reclamos de velocidad de PyPy proviene de ejecutarlo de esa manera; esto es solo para un ciclo de prueba rápido, porque traducir el intérprete lleva mucho tiempo.
Con eso entendido, debería 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 traduces a código C que ejecuta Python rápidamente. Allí se detiene el proceso; no hay más RPython para acelerar procesándolo nuevamente.
Entonces, "¿Cómo es posible que PyPy sea más rápido que CPython?" También se vuelve 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 es solo más rápido para programas susceptibles de compilación JIT). CPython nunca fue diseñado para ser una implementación altamente optimizada del lenguaje Python (aunque intentan hacerlo una implementación altamente optimizada , si sigue la diferencia).
La parte realmente innovadora del proyecto PyPy es que no escriben esquemas GC sofisticados o compiladores JIT a mano. Escriben el intérprete de manera relativamente sencilla en RPython, y para todos los RPython tiene un nivel inferior que Python, sigue siendo un lenguaje recolectado de basura orientado a objetos, un nivel mucho más alto que C. Luego, el marco de traducción agrega automáticamente cosas como GC y JIT. Entonces, el marco de traducción es enormeesfuerzo, pero se aplica igualmente bien al intérprete de PyPy python, sin embargo, cambian su implementación, lo que permite mucha más libertad en la experimentación para mejorar el rendimiento (sin preocuparse por introducir errores de GC o actualizar el compilador JIT para hacer frente a los cambios). También significa que cuando implementan un intérprete de Python3, obtendrán automáticamente los mismos beneficios. Y cualquier otro intérprete escrito con el marco PyPy (del cual hay varios en diferentes etapas de pulido). Y todos los intérpretes que usan el marco PyPy admiten automáticamente todas las plataformas compatibles con el marco.
Entonces, el verdadero beneficio del proyecto PyPy es separar (tanto como sea posible) todas las partes de la implementación de un eficiente intérprete independiente de la plataforma para un lenguaje dinámico. Y luego proponga una buena implementación de ellos en un solo lugar, que pueda reutilizarse en muchos intérpretes. Esa no es una victoria inmediata como "mi programa Python se ejecuta 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).