Pregunta

Desde el Google Open Source Blog :

  

PyPy es una reimplementación de Python   en Python, utilizando técnicas avanzadas   para tratar de alcanzar un mejor rendimiento   que CPython. Muchos años de trabajo duro   finalmente han dado sus frutos. nuestra velocidad   Los resultados suelen golpear CPython, que van   de ser ligeramente más lento, a   aceleraciones de hasta 2x en bienes   código de la aplicación, a aceleraciones de hasta   10x en pequeños puntos de referencia.

¿Cómo es esto posible? ¿Qué aplicación Python se utilizó para implementar PyPy? CPython ? Y cuáles son las posibilidades de un PyPyPy o PyPyPyPy superando su puntuación?

(En una nota relacionada ... ¿por qué alguien intente algo como esto?)

¿Fue útil?

Solución

Q1. ¿Cómo es esto posible?

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

Las limitaciones en la aplicación de la CPython intérprete se oponen a ciertas optimizaciones que PyPy puede hacer (por ejemplo. Cerraduras de grano fino).

Como se mencionó Marcelo, el JIT. Ser capaz de confirmar en la mosca del tipo de un objeto puede ahorrar la necesidad de hacer múltiples desreferencias puntero para finalmente llegar al método al que desea llamar.

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

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

Q3. Y cuáles son las posibilidades de un PyPyPy o PyPyPyPy superando su puntuación?

Eso dependería de la aplicación de estos intérpretes hipotéticos. Si uno de ellos, por ejemplo, tomó la fuente, hizo algún tipo de análisis sobre el mismo y lo ha convertido directamente en código ensamblador específico objetivo apretado después de correr durante un tiempo, me imagino que sería bastante más rápido que CPython.

Actualización: Recientemente, en un cuidadosamente diseñado ejemplo , PyPy superaron un programa similar C compilado con gcc -O3. Es un caso artificial, pero no exhiben algunas ideas.

Q4. ¿Por qué alguien intente algo como esto?

Desde el sitio oficial. https://pypy.readthedocs.org/en/latest/architecture.html # misión de declaración

  

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 un lugar limpio
      la separación entre la especificación del lenguaje y la aplicación
      Aspectos. A esto le llamamos la RPython toolchain _.

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

  •   
     

Al separar las preocupaciones de esta manera, nuestra implementación de Python - y   otros lenguajes dinámicos - es capaz de generar automáticamente una   compilador Just-in-Time para cualquier lenguaje dinámico. También permite una   mezclar y emparejar enfoque de decisiones de implementación, incluyendo muchos   que han sido históricamente fuera del control de un usuario, tal como   plataforma de destino, los modelos de memoria y de roscado, la recolección de basura   estrategias y optimizaciones aplicadas, incluyendo si o no   tener un JIT en el primer lugar.

El compilador de C gcc está implementado en C, el compilador de Haskell GHC está escrito en Haskell. ¿Tiene alguna razón para que el intérprete de Python / compilador para no ser escrito en Python?

Otros consejos

"PyPy es una reimplementación de Python en Python" es una manera bastante engañosa para describir PyPy, en mi humilde opinión, aunque es técnicamente cierto.

Hay dos partes principales de PyPy.

  1. El marco de traducción
  2. El intérprete

El marco de traducción es un compilador. Se compila RPython código a C (u otros objetivos), añadiendo automáticamente en aspectos tales como la recogida de basura y un compilador JIT. Es no puede mango arbitraria de código Python, solamente RPython.

RPython es un subconjunto de Python normal; Código de toda RPython es el 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 por el marco de traducción de PyPy". Sin embargo, con el fin de ser traducido, código RPython tiene que ser tipos estáticos (los tipos se infieren, no se declara ellos, pero aún así es estrictamente un tipo por cada variable), y no se puede hacer cosas como declarar / modificar las funciones / clases en tiempo de ejecución, ya sea.

El intérprete entonces es un intérprete normal de Python escrito en RPython.

Dado que el código es RPython código normal de Python, se puede ejecutar en cualquier intérprete de Python. Pero ninguna de las alegaciones de velocidad de PyPy vienen de correr de esa manera; esto es sólo para un ciclo de prueba rápida, porque la traducción del intérprete toma un los tiempo.

Con ese entendido, debe ser inmediatamente obvio que las especulaciones sobre PyPyPy o PyPyPyPy en realidad no tienen ningún sentido. Tiene un intérprete escrito en RPython. Lo traduce a código C que ejecuta Python rápidamente. Hay detiene el proceso; no hay más es RPython para acelerar mediante el procesamiento de nuevo.

Así que "¿Cómo es posible que PyPy a ser más rápido que CPython" también se vuelve bastante obvio. PyPy tiene una mejor aplicación, incluyendo un compilador JIT (que generalmente no es tan rápido sin el compilador JIT, creo, lo que significa PyPy sólo es más rápido para los programas susceptibles a JIT-compilación). CPython nunca fue diseñado para ser una aplicación altamente optimización del lenguaje Python (aunque lo intentan para que sea un gran Optimizada aplicación, si se 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áticamente añade cosas como GC y JIT. Por lo que el marco de traducción es un 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 para hacer frente a los cambios). También significa que cuando llegan a su alrededor para implementar un intérprete python3, se obtendrá automáticamente los mismos beneficios. Y cualesquiera otros intérpretes escritos con el marco PyPy (de los cuales hay un número en distintas etapas de pulido). Y todos los intérpretes, utilizando el marco PyPy apoyan de forma automática todas las plataformas soportadas por el marco.

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 llegar a una buena aplicación de ellos en un solo lugar, que puede ser reutilizada a través de muchos intérpretes. Eso no es una victoria inmediata como "mi programa se ejecuta Python más rápido ahora", pero es una gran perspectiva para el futuro.

Y puede ejecutar su programa en Python más rápido (tal vez).

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

La razón para poner en práctica PyPy en la parte superior de Python es, probablemente, que es simplemente un lenguaje muy productiva, sobre todo porque el compilador JIT hace que el rendimiento de la lengua de acogida un tanto irrelevante.

PyPy está escrito en Python restringido. No se ejecuta en la parte superior del intérprete CPython, por lo que yo sé. Restringido Python es un subconjunto del lenguaje Python. Que yo sepa, el intérprete PyPy es compilado a código de máquina, por lo que una vez instalados, no utiliza un intérprete de Python en tiempo de ejecución.

Su pregunta parece esperar el PyPy intérprete se ejecuta en la parte superior de CPython durante la ejecución de código. Editar Sí, utilizar PyPy traducir primero el código Python PyPy, ya sea a C y de construcción con gcc, a código de bytes JVM, o al código .Net CLI. Ver href="http://codespeak.net/pypy/trunk/pypy/doc/getting-started-python.html" Introducción

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top