tutorial instalar python performance jit pypy cpython

python - instalar - pypy windows



¿Por qué no debería usar PyPy sobre CPython si PyPy es 6.3 veces más rápido? (10)

  1. PyPy, como otros han sido rápidos en mencionar, tiene un soporte tenue para las extensiones C. Tiene soporte, pero por lo general a velocidades más lentas que en Python y, en el mejor de los casos, es dudoso. Por lo tanto, muchos módulos simplemente requieren CPython. Cython y Numpy son increíbles para los números, y la mayoría de las personas que realmente necesitan velocidad en Python están usando esos (+ Pandas, SciPy, etc.) en gran medida. Ya que son inexistentes o tienen un soporte tenue y son lentos, las personas que necesitan un Python rápido a menudo están mejor con CPython tanto por su velocidad como por su facilidad de uso .
  2. El soporte de Python 3 es experimental en este momento. Acaba de llegar al establo! A partir del 20 de junio de 2014, PyPy3 2.3.1 - ¡Fulcrum está fuera !
  3. PyPy a veces no es realmente más rápido para los "scripts", para los cuales muchas personas usan Python. Estos son los programas de ejecución corta que hacen algo simple y pequeño. Debido a que PyPy es un compilador JIT, sus principales ventajas provienen de tiempos de ejecución largos y tipos simples (como los números). Francamente, las velocidades pre-JIT de PyPy son bastante malas en comparación con CPython.
  4. Inercia Mudarse a PyPy a menudo requiere una revisión, lo que para algunas personas y organizaciones es simplemente demasiado trabajo.

Esas son las principales razones que me afectan, diría yo.

NOTA: ¡ Esta pregunta es antigua! Evite sacar conclusiones a partir de información desactualizada.

He estado escuchando mucho sobre el proyecto PyPy . Afirman que es 6.3 veces más rápido que el intérprete de CPython en su sitio .

Cuando hablamos de lenguajes dinámicos como Python, la velocidad es uno de los temas principales. Para resolver esto, dicen que PyPy es 6.3 veces más rápido.

El segundo problema es el paralelismo, el infame Global Interpreter Lock (GIL). Para esto, PyPy dice que puede dar Python sin GIL .

Si PyPy puede resolver estos grandes desafíos, ¿cuáles son sus debilidades que impiden una adopción más amplia? Es decir, ¿qué impide que alguien como yo, un desarrollador típico de Python, cambie a PyPy ahora mismo ?


CPython tiene recuento de referencias y recolección de basura, PyPy solo tiene recolección de basura.

Por lo tanto, los objetos tienden a eliminarse antes y se llama a __del__ de una manera más predecible en CPython. Algunos programas se basan en este comportamiento, por lo que no están listos para migrar a PyPy.

Algún otro software funciona con ambos, pero usa menos memoria con CPython, porque los objetos no utilizados se liberan antes. (No tengo ninguna medida para indicar qué tan significativo es esto y qué otros detalles de implementación afectan el uso de la memoria).


Debido a que pypy no es 100% compatible, se necesitan 8 gigas de compilación, es un objetivo móvil y altamente experimental, donde cpython es estable, el objetivo predeterminado para los constructores de módulos durante 2 décadas (incluidas las extensiones c que no funcionan en pypy ), y ya ampliamente desplegado.

Pypy probablemente nunca será la implementación de referencia, pero es una buena herramienta para tener.


Ese sitio no afirma que PyPy sea 6.3 veces más rápido que CPython. Citar:

El promedio geométrico de todos los puntos de referencia es 0.16 o 6.3 veces más rápido que CPython

Esta es una declaración muy diferente a la declaración general que hizo, y cuando comprenda la diferencia, comprenderá al menos una serie de razones por las que no puede simplemente decir "usar PyPy". Puede sonar como si fuera un problema, pero entender por qué estas dos afirmaciones son totalmente diferentes es vital.

Para romper eso:

  • La declaración que hacen solo se aplica a los puntos de referencia que han utilizado. No dice absolutamente nada acerca de su programa (a menos que su programa sea exactamente igual a uno de sus puntos de referencia).

  • La declaración es sobre un promedio de un grupo de puntos de referencia. No hay ninguna afirmación de que ejecutar PyPy proporcione una mejora de 6.3 veces incluso para los programas que han probado.

  • No se puede afirmar que PyPy incluso ejecutará todos los programas que ejecuta CPython, y mucho menos más rápido.


He encontrado ejemplos, donde PyPy es más lento que Python. Pero: Sólo en Windows.

C:/Users/User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)" 10 loops, best of 3: 294 msec per loop C:/Users/User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)" 10 loops, best of 3: 1.33 sec per loop

Entonces, si piensas en PyPy, olvida Windows. En Linux, puedes lograr impresionantes aceleraciones. Ejemplo (liste todos los números primos entre 1 y 1,000,000):

from sympy import sieve primes = list(sieve.primerange(1, 10**6))

Esto se ejecuta 10 (!) Veces más rápido en PyPy que en Python. Pero no en las ventanas. Ahí está solo 3 veces más rápido.


Hice un pequeño punto de referencia sobre este tema. Si bien muchos de los otros pósters han hecho buenos puntos sobre la compatibilidad, mi experiencia ha sido que PyPy no es mucho más rápido solo para moverse. Para muchos usos de Python, realmente solo existe para traducir bits entre dos o más servicios. Por ejemplo, no muchas aplicaciones web están realizando un análisis intensivo de CPU de los conjuntos de datos. En su lugar, toman algunos bytes de un cliente, los almacenan en algún tipo de base de datos y luego los devuelven a otros clientes. A veces se cambia el formato de los datos.

Los desarrolladores de BDFL y CPython son un grupo de personas muy inteligente y han logrado ayudar a CPython a tener un desempeño excelente en tal escenario. Aquí hay un blog descarado: http://www.hydrogen18.com/blog/unpickling-buffers.html . Estoy usando Stackless, que se deriva de CPython y conserva la interfaz del módulo C completo. No encontré ninguna ventaja al usar PyPy en ese caso.


La segunda pregunta es más fácil de responder: básicamente puedes usar PyPy como reemplazo directo si todo tu código es Python puro. Sin embargo, muchas bibliotecas ampliamente utilizadas (incluidas algunas de la biblioteca estándar) están escritas en C y compiladas como extensiones de Python. Algunos de estos pueden hacerse para trabajar con PyPy, otros no. PyPy proporciona la misma herramienta "orientada hacia adelante" que Python, es decir, es Python, pero sus entrañas son diferentes, por lo que las herramientas que interactúan con esas entrañas no funcionarán.

En cuanto a la primera pregunta, me imagino que es una especie de Catch-22 con la primera: PyPy ha evolucionado rápidamente en un esfuerzo por mejorar la velocidad y mejorar la interoperabilidad con otros códigos. Esto lo ha hecho más experimental que oficial.

Creo que es posible que si PyPy entra en un estado estable, puede comenzar a ser más utilizado. También creo que sería fantástico que Python se aleje de sus fundamentos C Pero no va a pasar por un tiempo. PyPy aún no ha alcanzado la masa crítica donde es casi lo suficientemente útil por sí solo para hacer todo lo que quieras, lo que motivaría a las personas a llenar los vacíos.


Para hacer esto simple: PyPy proporciona la velocidad que le falta a CPython pero sacrifica su compatibilidad. La mayoría de las personas, sin embargo, eligen Python por su flexibilidad y su característica "batería incluida" (alta compatibilidad), no por su velocidad (aunque todavía se prefiere).


Para muchos proyectos, en realidad hay una diferencia del 0% entre las diferentes pitones en términos de velocidad. Esos son aquellos que están dominados por el tiempo de ingeniería y donde todos los pitones tienen la misma cantidad de soporte de biblioteca.


P: Si PyPy puede resolver estos grandes desafíos (velocidad, consumo de memoria, paralelismo) en comparación con CPython, ¿cuáles son sus debilidades que impiden una adopción más amplia?

R: Primero, hay poca evidencia de que el equipo de PyPy pueda resolver el problema de la velocidad en general . La evidencia a largo plazo muestra que PyPy ejecuta ciertos códigos de Python más lentamente que CPython y este inconveniente parece estar muy arraigado en PyPy.

En segundo lugar, la versión actual de PyPy consume mucha más memoria que CPython en un conjunto bastante amplio de casos. Así que PyPy no resolvió el problema de consumo de memoria todavía.

Si PyPy resuelve los grandes desafíos mencionados y, en general, será más rápido, menos hambre de memoria y más amigable con el paralelismo que CPython es una pregunta abierta que no se puede resolver a corto plazo. Algunas personas están apostando a que PyPy nunca podrá ofrecer una solución general que le permita dominar CPython 2.7 y 3.3 en todos los casos.

Si PyPy logra ser mejor que CPython en general, lo que es cuestionable, la principal debilidad que afecta a su adopción más amplia será su compatibilidad con CPython. También existen problemas como el hecho de que CPython se ejecuta en una amplia gama de CPU y sistemas operativos, pero estos problemas son mucho menos importantes en comparación con el rendimiento de PyPy y los objetivos de compatibilidad con CPython.

P: ¿Por qué no puedo eliminar el reemplazo de CPython con PyPy ahora?

R: PyPy no es 100% compatible con CPython porque no simula CPython debajo del capó. Algunos programas aún pueden depender de las características únicas de CPython que están ausentes en PyPy, como los enlaces C, las implementaciones en C de objetos y métodos de Python, o la naturaleza incremental del recolector de basura de CPython.