2011-05-27 27 views
9

Lleva horas traducir la implementación de pypy a archivos c y compilar pypy-c en una notebook moderna, con 2G mem y una CPU Intel Core2 de 2GHz.¿Por qué PyPy se traduce tan lento?

Sé que es una tarea intensiva en la CPU, pero ¿tiene que ser tan lenta? ¿Hay alguna posibilidad o espacio para reducir el cálculo, reorganizar la orden informática y reducir el tiempo a decenas de minutos?

Respuesta

12

exención de responsabilidad: No soy un experto en PyPy - en particular, no entiendo los detalles de la traducción RPython, sólo estoy citando docs y lo overheared en la lista de correo y en el blog.

"Una tarea intensiva de CPU"? Nominado para la subestimación del mes. No entiendo muy bien los detalles del proceso de traducción, pero incluso puedo decirle que cada uno de sus varios pases de análisis y optimización hace un montón de trabajo muy complejo a un montón de código.

  1. Empieza a ejecutar el código de Python normalmente, p. importar módulos, ejecutar definiciones de variables a nivel de módulo, definir funciones y clases, aplicarles decoradores, etc. En algún momento, cuando se debe lograr "estática suficiente", detiene y continúa el proceso de traducción real.
  2. Toma el programa Python congelado en memoria en progreso y lo ejecuta todo en un espacio de objetos especial que simula el control de flujo, los valores posibles de las variables, etc. ¡Se trata esencialmente de ejecutar el intérprete simbólicamente! Hace esto para realizar inferencia de tipo (todo menos fácil en un lenguaje como Python) y análisis adicional.
  3. Los resultados se convierten en código de bajo nivel.
  4. Opcionalmente, muchas optimizaciones (habilitadas de manera predeterminada, supongo) y una transformación compleja para el soporte sin pila (deshabilitado de manera predeterminada, supongo) seguir.
  5. Luego, bajando todo eso a un sistema tipo que se adecue al backend designado, genera millones de líneas de código (a partir de una entrada reciente en la lista de correo parece que hay al menos 19 archivos .c y al menos uno de ellos contiene al menos 247,560 líneas, para que tenga una idea del orden de magnitud del que estamos hablando).
  6. Todo ese código está compilado con gcc -O2 o similar, que por supuesto tiene una gran cantidad de análisis y verificación para hacer y tendrá muchos pases de análisis y optimización para hacer.

Así que sí, es una tarea MUY enloquecedora. No es de extrañar que pierdas tu pequeña CPU. Como referencia, los chicos de PyPy usaron un Intel Xeon W3580 (3.33 GHz) cuando benchmarking the translation process in November 2010. Todavía les tomó alrededor de 76 minutos, aunque también tenían 12 GB de RAM, lo que lleva a la siguiente edición: Se necesita mucho de RAM en el proceso (2.3 GB en Ubuntu de 64 bits en ese entonces, no lo sé cómo los números se traducen a su situación). Estoy bastante seguro de que terminas excediendo tu RAM física: ingresa un intercambio excesivo y una patada asociada a la ingle del rendimiento.

Eso, combinado con el hecho de que de manera propagable tenías muchos otros programas corriendo robando tiempo de CPU y RAM, explica tu experiencia bastante bien en mi opinión. La traducción de PyPy está reservada para computadoras más potentes. Si hay algo que puede mejorar fundamentalmente estos tiempos, es poco probable que personas ajenas como nosotros lo encuentren. Dejaría estas preocupaciones a los desarrolladores.

+1

Gracias por la respuesta rápida.Como no tengo mucha memoria, utilizo el python oficial para ejecutar el traductor, lo que probablemente hace que el proceso sea más extenso de lo que debería ser según el documento, pero conseguí que Pypy se creara correctamente en mi máquina deficiente. – jaimechen