2010-06-03 20 views
40

Nota: El título es deliberadamente provocativo (para hacer que haga clic en él y desea cerrarlo, vota la pregunta) y no quiero parecer preocupado.PyPy: ¿De qué se trata todo esto?

He estado leyendo y escuchando más y más sobre PyPy. Es como un gráfico lineal.

  • ¿Por qué PyPy es tan especial? Por lo que yo sé, las implementaciones de lenguajes dinámicos escritos en los idiomas en sí no son algo tan raro, ¿o no estoy obteniendo algo?

  • Algunas personas incluso llaman a PyPy "el futuro" [de python], o ven algún tipo de potencial profundo en esta implementación. ¿Cuál es exactamente el significado de esto?

+6

¿Qué se preocupa? – fmark

+0

En realidad, la palabra es "provocativa", que creo que es Manglish para "provocativo". – martineau

+22

Debo admitir que estoy un poco confuso –

Respuesta

10

Lo bueno de PyPy (aparte de ser rápido y escrito en RPython (un subconjunto del lenguaje Python) así que básicamente bootstrap, es que puede proporcionar una JIT crea automáticamente (justo en el compilador tiempo) para cualquier programa se escribe en PyPy:. esto lo hace ideal para poner en práctica, de forma rápida, en su propio idioma y tiene que ser bastante rápido

Leer más here

4

Dado que la mayoría de nosotros estamos de acuerdo que es más fácil de escribir Python que C, un intérprete de Python escrito en Python (bueno, técnicamente RPython) debería poder modificarse mucho más fácilmente y con menos errores que CPython.

5

Sin mencionar que recientemente excedieron la velocidad de CPython en algunos puntos de referencia. Ver su blog, creo. No puedo llegar a ella desde aquí:

http://morepypy.blogspot.com/

45

buena cosa a tener en cuenta cuando se habla del proyecto PyPy es que su objetivo es proporcionar en realidad dos entregas: En primer lugar es generador de compilador JIT . Sí, generador, lo que significa que están implementando un marco para escribir implementaciones de lenguajes de programación altamente dinámicos, como Python. El segundo es la prueba real de este marco, y es la implementación del intérprete PyPy Python .

Ahora, hay respuestas múltiples por las que PyPy es tan especial: el desarrollo del proyecto se ejecuta desde 2004, comenzó como un proyecto de investigación en lugar de una empresa, vuelve a implementar Python en Python, implementa un compilador JIT en Python y puede traducir RPython (código de Python con algunas limitaciones para que el marco pueda traducir ese código a C) al compilado binario.

La versión actual de PyPy es 99% compatible con CPython versión 2.5, y puede ejecutar Django, Twisted y muchos otros programas de Python. Solía ​​haber una limitación de no poder ejecutar las extensiones existentes de CPython C, pero eso también se está abordando con el módulo cpyext en PyPy. La compatibilidad con C API es posible y hasta cierto punto ya está implementada. JIT también es muy real, mira esta comparación de Pystone.

Con CPython:

Python 2.5.5 (r255:77872, Apr 21 2010, 08:44:16) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from test import pystone 
>>> pystone.main(1000000) 
Pystone(1.1) time for 1000000 passes = 12.28 
This machine benchmarks at 81433.2 pystones/second 

Con PyPy:

Python 2.5.2 (75632, Jun 28 2010, 14:03:25) 
[PyPy 1.3.0] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
And now for something completely different: ``A radioactive cat has 18 
half-lives.'' 
>>>> from test import pystone 
>>>> pystone.main(1000000) 
Pystone(1.1) time for 1000000 passes = 1.50009 
This machine benchmarks at 666625 pystones/second 

para que pueda obtener un aumento de velocidad de casi 10 veces sólo mediante el uso PyPy en algunos cálculos!

Por lo tanto, como el proyecto PyPy está madurando lentamente y ofrece algunas ventajas, está atrayendo más el interés de las personas que tratan de abordar los problemas de velocidad en su código. Una alternativa a PyPy es unladden swallow (un proyecto de Google) que tiene como objetivo acelerar la implementación de CPython utilizando las capacidades JIT de LLVM, pero el progreso en unladden swallow se ralentizó porque el desarrollador tuvo que lidiar con errores en LLVM.

Por lo tanto, para resumir, supongo que PyPy se considera el futuro de Python porque separa la especificación del lenguaje de la implementación de VM. Características introducidas en, por ej. sin apilar Python, podría implementarse en PyPy con muy poco esfuerzo adicional, ya que solo está alterando la especificación del lenguaje y mantiene el mismo código compartido. Menos código, menos errores, menos fusión, menos esfuerzo.

Y al escribir, por ejemplo, una nueva implementación de shell bash en RPython, puede obtener un compilador JIT de forma gratuita y acelerar muchos guiones de shell linux sin aprender realmente ningún conocimiento pesado de JIT.

+13

Déjeme aclarar esto. ¿Un intérprete de Python escrito en Python y ejecutándose en otro intérprete de Python escrito en, digamos, C, puede ejecutar otros programas de Python más rápido que aquel en el que se está ejecutando? Si es así, parece que podrías hacer eso por algunos niveles más y tener algo increíblemente rápido ... – martineau

+13

El intérprete de PyPy Python no es rápido cuando lo ejecutas en CPython. Es rápido cuando lo arranca desde otro intérprete de Python para poder ejecutar * solo *. Entonces agregar más intérpretes a la pila no hará que nada sea más rápido, lo siento.:) –

+4

Para aclarar esto: el intérprete PyPy es un ejecutable. Está escrito en RPython, pero ese RPython es compilado por el traductor PyPy. Básicamente, se inicia cuando compila el intérprete PyPy (porque probablemente usará CPython para ejecutar el traductor que compila el intérprete), pero una vez que se compila el intérprete, es independiente. Tan solo porque está escrito en Python no significa que deba ejecutarse en un intérprete de Python. –

21

Veamos de esta manera ... Supongamos que desea implementar su propio lenguaje dinámico, y desea hacerlo rápido. Tiene dos opciones: la más difícil y la más simple.

La manera más difícil es escribir su intérprete en c, y luego implementar un jit a mano, también en c, usando una combinación de técnicas muy complicadas como jit de método, jit enhebrado, seguimiento de jit, cachés en línea polimórficos , movimiento de bucle invariable, etc., etc. Pasó varios años sintonizándolo y, si perseveras mucho y no te rindes, puedes terminar con una implementación de lenguaje dinámico y rápido.

O bien, puede utilizar el marco pypy. Eso significa escribir tu intérprete en python en lugar de c (en realidad, sería rpython, un subconjunto más limitado de python que se puede compilar en c). Una vez que haya escrito su intérprete, pypy generará automáticamente un jit de forma gratuita. Y básicamente has terminado.

Suena bien, ¿eh?

+0

+1 por 'Supongamos que desea implementar su propio lenguaje dinámico y desea hacerlo rápido. Tienes dos opciones: la más difícil y la más pipy. – IronManMark20