2010-04-07 27 views
216

Desde el Google Open Source Blog:PyPy: ¿cómo puede vencer a CPython?

PyPy es una reimplementación de Python en Python, utilizando técnicas avanzadas para tratar de alcanzar un mejor rendimiento de CPython. Muchos años de duro trabajo finalmente han valido la pena. Nuestra velocidad resultados a menudo venció CPython, que van de ser un poco más lento, a aceleraciones de hasta 2x en el código de aplicación real , hasta 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 intente algo como esto?)

+32

Nitpick: PyPy * es * PyPyPy. Piense en el prefijo Py- * como operador de proyección. – u0b34a0f6ae

+0

Ok. entonces PyPy debería ser preferible a CPython? ¿Tiene algún inconveniente? – balki

+8

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. –

Respuesta

133

Q1. ¿Cómo es esto posible?

La gestión de memoria manual (que es lo que CPython hace con su recuento) puede ser más lenta que la gestión automática en algunos casos.

Las limitaciones en la implementación del intérprete CPython impiden ciertas optimizaciones que PyPy puede hacer (por ejemplo, bloqueos de grano fino).

Como mencionó Marcelo, el JIT. Ser capaz de sobre la marcha confirmar el tipo de un objeto puede ahorrarle la necesidad de hacer desreferencias de múltiples punteros para finalmente llegar al método que desea llamar.

Q2. ¿Qué implementación de Python se utilizó para implementar PyPy?

El intérprete PyPy se implementa en RPython que es un subconjunto de Python tipado estáticamente (el lenguaje y no el intérprete CPython). - Consulte https://pypy.readthedocs.org/en/latest/architecture.html para más detalles.

Q3. ¿Y cuáles son las posibilidades de que PyPyPy o PyPyPyPy superen su puntaje?

Eso dependería de la implementación de estos intérpretes hipotéticos. Si uno de ellos, por ejemplo, tomó la fuente, hizo algún tipo de análisis y la convirtió directamente en un código de ensamblaje específico de destino ajustado después de ejecutarse durante un tiempo, me imagino que sería bastante más rápido que CPython.

Actualización: Recientemente, en un carefully crafted example, PyPy superó un programa similar C compilado con gcc -O3. Es un caso artificial pero muestra 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:

  • traducción común y un marco de apoyo para la producción de
    implementaciones de lenguajes dinámicos, haciendo hincapié en una limpia separación entre
    especificación del lenguaje y la aplicación
    aspectos. Llamamos a esto RPython toolchain _.

  • una aplicación compatible, flexible y rápida de la Python_ lenguaje que utiliza la cadena de herramientas de arriba para permitir nuevas características avanzadas de alto nivel sin tener que codificar el bajo nivel de detalles.

mediante la separación de las preocupaciones de esta manera, nuestra implementación de Python - y otros lenguajes dinámicos - es capaz de generar automáticamente un compilador Just-in-Time para cualquier lenguaje dinámico. También permite un enfoque de combinación y coincidencia con las decisiones de implementación, incluidos muchos que históricamente han estado fuera del control del usuario, como plataforma de destino, modelos de memoria y de subprocesamiento, estrategias de recopilación de basura y optimizaciones aplicadas, incluso si o no a tener un JIT en primer lugar.

El compilador de C gcc está implementado en C, el compilador de Haskell GHC está escrito en Haskell. ¿Tiene algún motivo para que el intérprete/compilador de Python no se escriba en Python?

+69

Esta respuesta falta por completo la explicación principal de cómo PyPy es rápido; mientras que menciona que PyPy no está realmente implementado en Python, pero en RPython, no señala que el código RPython esté * compilado y optimizado estáticamente * para producir el intérprete PyPy (también es válido el código de Python que se puede ejecutar) encima de CPython mucho más lentamente). Lo que han implementado en "Python normal" es el "compilador" RPython (el marco de traducción al que se hace referencia en el presupuesto del bloque). – Ben

+11

Esto está enterrando al lede. La mayor parte del rendimiento proviene de la traducción a C (que hace que el intérprete no sea mucho más lento que CPython), y JIT, que hace que los caminos calientes sean mucho más rápidos. – Tobu

+3

* "Actualización: Recientemente, en un ejemplo cuidadosamente elaborado, PyPy superó un programa C similar compilado con gcc -O3." * Y si lees el primer comentario debajo de esa publicación, verás que el escritor de esa publicación no lo hace conocer la optimización del tiempo de enlace. Con la optimización del tiempo de enlace habilitada, el código C se ejecuta más rápido. – Ali

22

PyPy está implementado en Python, pero implementa un compilador JIT para generar código nativo sobre la marcha.

La razón para implementar PyPy encima de Python es probablemente que es simplemente un lenguaje muy productivo, especialmente dado que el compilador JIT hace que el rendimiento del lenguaje de host sea algo irrelevante.

+0

¿El JIT genera código Python ejecutándose en el mismo nivel que PyPy, o genera un código nativo real que se ejecuta en el nivel de la implementación de Python en la que se está ejecutando PyPy? – Edmund

+3

código nativo real (ver [aquí] (http://pypy.org/download.html#with-a-jit-compiler)); Código x86 de 32 bits para ser precisos. –

11

PyPy está escrito en Python Restringido. No se ejecuta sobre el intérprete CPython, hasta donde yo sé. Python restringido es un subconjunto del lenguaje Python. AFAIK, el intérprete PyPy está compilado para código de máquina, por lo que cuando se instala no utiliza un intérprete de Python en tiempo de ejecución.

Parece que su pregunta es que el intérprete PyPy se está ejecutando sobre CPython al ejecutar el código. Edit: Sí, para usar PyPy primero debe traducir el código PyPy python, ya sea a C y compilar con gcc, a código de byte jvm, o al código .Net CLI. Ver Getting Started

+7

PyPy se ejecutará sobre CPython, pero en este modo no proporciona las ganancias de velocidad que uno pueda desear. :-) http://codespeak.net/pypy/dist/pypy/doc/getting-started-python.html#id9 –

253

"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.

  1. El marco traducción
  2. 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).

+11

Esta es una de las mejores explicaciones que he leído hasta ahora. Incluso vi la charla de David Beazley sobre PyPy durante PyCon, pero era muy difícil de masticar. : P – Chirag

+3

No pude seguir la diferencia :( – polvoazul

+27

@polvoazul La diferencia entre una implementación del lenguaje * optimizado * y una * optimización * uno Bueno, cuando digo que el CPython es una implementación bien optimizada, quiero decir que los desarrolladores intentan hacer los algoritmos internos del intérprete y las estructuras de datos incorporadas se ejecutan de manera eficiente. Una implementación * optimizing *, OTOH, analizaría el * código de los usuarios finales * y trataría de encontrar maneras de transformarlo para ejecutarlo de manera más eficiente. – Ben

Cuestiones relacionadas