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


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

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

El segundo problema es el paralelismo, el infame Bloqueo de intérprete global (GIL). Para esto, PyPy lo dice 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, lo que impide que alguien como yo, un desarrollador típico de Python, cambie a PyPy ahora mismo?


598
2017-09-22 17:24


origen


Respuestas:


  1. PyPy, como otros han mencionado rápidamente, tiene soporte tenue para extensiones C. Eso tiene soporte, pero típicamente a velocidades más lentas que las de Python y es dudoso en el mejor de los casos. De ahí muchos módulos simplemente exigir CPython. Cython y Numpy son increíble para los numéricos, 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 tenuemente compatibles y lento las personas que necesitan un Python rápido a menudo están mejor con CPython tanto por la velocidad como por la facilidad de uso.
  2. Soporte para Python 3 es experimental en este momento.  acaba de llegar a estable! A partir del 20 de junio de 2014, PyPy3 2.3.1 - El fulcro está fuera!
  3. PyPy a veces no es realmente más rápido para "guiones", que mucha gente usa Python. Estos son los programas de ejecución corta que hacen algo simple y pequeño. Como PyPy es un compilador JIT, sus principales ventajas provienen de los tiempos largos y los tipos simples (como los números). Francamente, Las velocidades pre-JIT de PyPy son bastante malas comparado con CPython.
  4. Inercia. Pasar a PyPy a menudo requiere reorganización, lo que para algunas personas y organizaciones es simplemente demasiado trabajo.

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

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


603
2017-09-22 17:40



Ese sitio no no afirma que PyPy es 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

Esto es un muy declaración diferente a la declaración general que hiciste, y cuando entiendes la diferencia, entenderás al menos una serie de razones por las que no puedes simplemente decir "usar PyPy". Puede sonar como si fuera una trampa, pero comprender 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 sobre 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 ningún reclamo de que ejecutar PyPy le dará 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. en absoluto, y mucho menos más rápido.


94
2017-09-22 21:42



Debido a que pypy no es 100% compatible, toma 8 gigas de ram para compilar, es un objetivo móvil y altamente experimental, donde cpython es estable, el objetivo predeterminado para los creadores 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.


67
2017-09-22 17:27



La segunda pregunta es más fácil de responder: básicamente poder use PyPy como un reemplazo directo si todo su código es puro Python. 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 funcionar 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 estado evolucionando 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 llega a un estado estable, puede comenzar a ser más utilizado. También creo que sería genial para Python alejarse de sus bases de C. Pero no sucederá por un tiempo. PyPy aún no ha alcanzado la masa crítica donde está casi lo suficientemente útil como para hacer todo lo que quisieras, lo que motivaría a las personas a llenar los vacíos.


34
2017-09-22 17:31



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?

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

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

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

Si PyPy logra ser mejor que CPython en general, lo cual es cuestionable, la principal debilidad que afecta 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 gama más amplia 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 reemplazar el CPython con PyPy ahora?

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


14
2017-09-23 11:32



Hice un pequeño punto de referencia sobre este tema. Si bien muchos de los otros carteles han resaltado la compatibilidad, mi experiencia ha sido que PyPy no es mucho más rápido para moverse solo por los bits. Para muchos usos de Python, realmente solo existe para traducir bits entre dos o más servicios. Por ejemplo, no muchas aplicaciones web realizan análisis intensivos de CPU de conjuntos de datos. En cambio, 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, el formato de los datos se cambia.

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


13
2017-09-22 19:02



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

Entonces, los objetos tienden a borrarse antes y __del__ se llama de una manera más predecible en CPython. Algunos softwares 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).


8
2017-09-22 23:01



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


4
2017-09-23 10:13



Para hacerlo simple: PyPy proporciona la velocidad que le falta a CPython pero sacrifica su compatibilidad. La mayoría de las personas, sin embargo, eligen a Python por su flexibilidad y su característica "batería incluida" (alta compatibilidad), no por su velocidad (aún así es preferible).


4
2018-03-14 00:02



Encontré ejemplos, donde PyPy es más lento que Python. Pero: solo 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, olvídate de Windows. En Linux, puedes lograr increíbles aceleraciones. Ejemplo (enumere 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 windows. Ahí solo es 3 veces más rápido.


4
2017-10-05 21:32