instalar - PyPy-¿Cómo puede vencer a CPython?
pypy vs python (4)
"PyPy es una reimplementación de Python en Python" es una forma bastante engañosa de describir PyPy, IMHO, 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 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 "el subconjunto de Python que se puede traducir mediante el marco de traducción de PyPy". Pero para ser traducido, el código RPython debe escribirse de forma estática (los tipos se deducen, no los declara, pero sigue siendo estrictamente un tipo por variable), y no puede 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.
Debido a que el código RPython es un código Python normal, puede ejecutarlo en cualquier intérprete de Python. Pero ninguna de las afirmaciones de velocidad de PyPy proviene de ejecutarlo de esa manera; esto es solo para un ciclo de prueba rápido, porque la traducción del intérprete toma 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 un código C que ejecuta Python rápidamente. Allí el proceso se detiene; no hay más RPython para acelerar procesándolo de nuevo.
Así que "¿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 convertirla en una implementación altamente optimizada , si sigues la diferencia).
Lo realmente innovador del proyecto PyPy es que no escriben a mano los esquemas GC sofisticados o los compiladores JIT. Escriben al intérprete de forma relativamente sencilla en RPython, y para todos RPython es un nivel más bajo que Python, sigue siendo un lenguaje de recolección de basura orientado a objetos, mucho más alto que C. Luego, el marco de traducción agrega automáticamente cosas como GC y JIT. Por lo tanto, el marco de traducción es un gran esfuerzo, pero se aplica igualmente bien al intérprete python de PyPy, sin embargo, cambian su implementación, lo que permite mucha más libertad en la experimentación para mejorar el rendimiento (sin preocuparse por la introducción de errores GC o la actualización del compilador JIT para hacer frente 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 el marco PyPy soportan automáticamente todas las plataformas compatibles con el marco.
Entonces, el verdadero beneficio del proyecto PyPy es separar (en la medida de lo posible) todas las partes de la implementación de un intérprete independiente de plataforma eficiente para un lenguaje dinámico. Y luego cree 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).
Desde el blog de código abierto de Google :
PyPy es una reimplementación de Python en Python, utilizando técnicas avanzadas para tratar de lograr un mejor rendimiento que CPython. Muchos años de trabajo duro finalmente han dado sus frutos. Nuestros resultados de velocidad a menudo superan a CPython, desde ser un poco más lento, a aceleraciones de hasta 2x en código de aplicación real, a aceleraciones de hasta 10x en pequeños puntos de referencia.
¿Cómo es esto posible? ¿Qué implementación de Python se utilizó para implementar PyPy? CPython ? ¿Y cuáles son las posibilidades de que PyPyPy o PyPyPyPy superen su puntaje?
(En una nota relacionada ... ¿por qué alguien intentaría algo como esto?)
PyPy está escrito en Python restringido. No funciona sobre el intérprete de CPython, que yo sepa. Python restringido es un subconjunto del lenguaje Python. AFAIK, el intérprete de PyPy se compila al código de la máquina, por lo que cuando se instala no utiliza un intérprete de Python en tiempo de ejecución.
Su pregunta parece esperar que el intérprete de PyPy se esté ejecutando sobre CPython mientras ejecuta el código. Edición: Sí, para usar PyPy, primero debe traducir el código de Python de PyPy, ya sea a C y compilar con gcc, a código de byte jvm, o al código .Net CLI. Ver Cómo empezar
PyPy se implementa en Python, pero implementa un compilador JIT para generar código nativo sobre la marcha.
La razón para implementar PyPy en la parte superior de Python es que es simplemente un lenguaje muy productivo, especialmente porque el compilador JIT hace que el rendimiento del lenguaje principal sea algo irrelevante.
Q1. ¿Cómo es esto posible?
La administración manual de memoria (que es lo que hace CPython con su conteo) puede ser más lenta que la administración automática en algunos casos.
Las limitaciones en la implementación del intérprete de CPython impiden ciertas optimizaciones que PyPy puede hacer (por ejemplo, bloqueos de grano fino).
Como mencionó Marcelo, el JIT. Ser capaz de confirmar sobre la marcha el tipo de un objeto puede ahorrarle la necesidad de hacer varias referencias de punteros para llegar finalmente al método al que desea llamar.
Q2. ¿Qué implementación de Python se utilizó para implementar PyPy?
El intérprete de PyPy se implementa en RPython, que es un subconjunto estático de Python (el lenguaje y no el intérprete de CPython). - Consulte https://pypy.readthedocs.org/en/latest/architecture.html para obtener más información.
Q3. ¿Y cuáles son las posibilidades de que PyPyPy o PyPyPyPy superen su puntaje?
Eso dependería de la implementación de estos hipotéticos intérpretes. Si uno de ellos, por ejemplo, tomó el origen, realizó algún tipo de análisis y lo convirtió directamente en un código de ensamblaje específico de objetivo estricto después de ejecutar durante un tiempo, me imagino que sería bastante más rápido que CPython.
Actualización: Recientemente, en un ejemplo cuidadosamente elaborado , PyPy superó a un programa C similar compilado con gcc -O3
. Es un caso artificial, pero exhibe algunas ideas.
Q4. ¿Por qué alguien intentaría algo como esto?
Desde el sitio oficial. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement
Nuestro objetivo es proporcionar:
Un marco común de traducción y soporte para la producción.
Implementaciones de lenguajes dinámicos, enfatizando una limpieza.
Separación entre la especificación del lenguaje y la implementación.
aspectos Llamamos a esto laRPython toolchain
_.una implementación compatible, flexible y rápida de Python_ Language que utiliza la cadena de herramientas anterior para habilitar nuevas funciones avanzadas de alto nivel sin tener que codificar los detalles de bajo nivel.
Al separar las preocupaciones de esta manera, nuestra implementación de Python (y otros lenguajes dinámicos) puede generar automáticamente un compilador Just-in-Time para cualquier lenguaje dinámico. También permite un enfoque mixto y coincidente para las decisiones de implementación, incluidos muchos que históricamente han estado fuera del control del usuario, como la plataforma de destino, los modelos de memoria y subprocesos, las estrategias de recolección de basura y las optimizaciones aplicadas, incluido el hecho de tener o no Un JIT en primer lugar.
El compilador gcc de C se implementa en C, el compilador GHC de Haskell se escribe en Haskell. ¿Tiene alguna razón para que el intérprete / compilador de Python no esté escrito en Python?