paint-brush
¿Cuál es la versión más rápida de Python?por@anthonypjshaw
68,013 lecturas
68,013 lecturas

¿Cuál es la versión más rápida de Python?

por Anthony Shaw2018/03/30
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Por supuesto, “depende”, pero ¿de qué depende y cómo puedes evaluar cuál es la versión de Python más rápida para tu aplicación?

Company Mentioned

Mention Thumbnail
featured image - ¿Cuál es la versión más rápida de Python?
Anthony Shaw HackerNoon profile picture

Por supuesto, “depende”, pero ¿de qué depende y cómo puedes evaluar cuál es la versión de Python más rápida para tu aplicación?

¿Python 3 es más lento que Python 2? ¿Qué versión de Python 3 es la más rápida y qué otras opciones tiene para la velocidad?

Uso de la utilidad de la suite de rendimiento

El equipo central de Python se preocupa mucho por el rendimiento, como mencioné antes en el sitio web speed.python.org, que es excelente para comparar los puntos de referencia "oficiales" con las versiones de CPython.

Sin embargo, hay un par de problemas:

  1. Los resultados son bastante difíciles de leer.
  2. No incluyen PyPy

En su lugar, puede descargar la caja de herramientas que ejecuta este sitio web ejecutando pip install performance y luego puede ejecutar

pyperformance run --python={chosen_python_runtime} -o my_results.json

Esto ejecutará una serie de aplicaciones documentadas del "mundo real" contra esa versión objetivo de Python varias veces y registrará la media, la mediana y

Esto es efectivamente lo que he hecho para este artículo, contra las instalaciones oficiales de Python:

  • 2.7.10,
  • 3.4.4,
  • 3.5.4,
  • 3.6.1, y
  • 3.7 (tengo beta 2).

Además, esto incluye PyPy (5.6.) y PyPy3 (5.4.10).

Los resultados

He desglosado los resultados según el caso de uso, así que eche un vistazo, ejecute su propia prueba y posiblemente escriba su propia prueba.

También creé un script simple para tomar una lista de archivos de datos de rendimiento y crear gráficos para cada prueba. El código está en GitHub .

En todos los gráficos, los resultados están en segundos y cuanto más bajo, mejor.

Los resultados completos junto con los gráficos están disponibles aquí: https://github.com/tonybaloney/performance_testing/tree/master/png

He incluido las pruebas que consideré significativas. El resto de las pruebas muestran patrones muy similares, que se encuentran en la conclusión.

Representación de plantillas HTML

La prueba django_html utilizará el motor de representación de plantillas de Django para crear una tabla HTML de 150x150 celdas. Aprovecha las clases de contenido y plantilla del motor Django.

Python 3.7 es 1,19 veces más rápido que Python 2.7 , pero la única versión de Python 3.x que superó el punto de referencia de Python 2.7 que ejecuté. El banco de pruebas speed.python.org muestra resultados similares.

PyPy aplasta cualquiera de los resultados de CPython, pero con PyPy3 el doble de lento que PyPy. Vale la pena señalar la reciente decisión de Django de eliminar la compatibilidad con Python 2 en Django 2.0 y posteriores, lo que significa que PyPy ya no sería compatible con Django 2.

Tiempo de inicio

Esta prueba simplemente prueba el tiempo que tarda el intérprete en comenzar. Si está eludiendo la restricción "GIL" de Python ejecutando múltiples procesos, entonces esto será significativo.

Tome nota aquí sobre el salto con PyPy, especialmente PyPy3, explicaré por qué al final de este artículo.

Pero el quid de esto es que el tiempo de inicio de Python 2.7 sigue invicto.

Criptografía: crypto_paes

En esta prueba, verá una caída notable en la velocidad entre Python 2 y 3. ¿Por qué? Crypto requiere mucho procesamiento de números y Python 3 ya no tiene un tipo de entero de 32 bits, solo un entero (muy) largo.

Usuarios de PyPy: ¡notarán que PyPy3 es casi 5 veces más lento que PyPy!

n-queens: la prueba del algoritmo

Esta implementación no es particularmente elegante, y lo siento por traer malos recuerdos a cualquiera que haya tenido que asistir a las conferencias de Algorithms sobre este tema. El rompecabezas consiste simplemente en colocar (n) Reinas en un tablero de ajedrez para que no puedan enfrentarse entre sí.

De la serie CPython, 3.7 vuelve a ser el primero , pero los resultados de PyPy y PyPy3 son muy similares.

Aritmética de punto flotante

El punto de referencia "flotante" es una aplicación pesada de aritmética de punto flotante artificial que creará 100,000 objetos de punto que calculan math.cos() , math.sin() y math.sqrt() .

Este es el tipo de aplicación que es perfecto para PyPy, muchos cálculos numéricos, tipos y métodos predecibles y bucles. Python 3.7 tiene el nuevo código de operación de llamada de método rápido que se utiliza en esta prueba.

Expresiones regulares

En la prueba de expresiones regulares, “50 de las páginas más populares en la web y el registro de todas las operaciones de expresiones regulares realizadas. A cada operación se le asigna un peso que se calcula a partir de una estimación de la popularidad de las páginas donde ocurre y la cantidad de veces que se ejecuta mientras se carga cada página. Finalmente, las letras literales en los datos se codifican usando ROT13 de una manera que no afecta la forma en que las expresiones regulares coinciden con su entrada".

No sé qué le pasó a PyPy aquí, ¡tendría curiosidad por saber si alguien más tiene el mismo resultado!

Actualización : el equipo de PyPy vio este artículo y solucionó el problema en varias horas

Entonces, ¿Python 3 es más rápido que Python 2?

¡Sí! en casi todas las pruebas . Las excepciones notables fueron la prueba crypto_paes , donde Python 3 fue 1,35 veces más lento (debido a los tipos de enteros), python_startup fue 1,39 veces más lento.

El inicio lento de Python 3 es uno de los problemas en los que está trabajando el equipo central de CPython para las versiones 3.8 y 3.9.

Aparte de esas 2 pruebas, Python 3 es entre 1,2 y 1,3 veces más rápido en estos puntos de referencia. Debería ver una mejora al actualizar a Python 3.7 cuando llegue a los estantes a finales de este año.

¿Por qué PyPy es mucho más rápido y por qué no todo el mundo lo usa en su lugar?

PyPy es más rápido que CPython ya que tiene un compilador Just-in-time. Los compiladores JIT tienen la gran ventaja de que son muy eficientes en la ejecución de tareas predecibles y repetitivas. Una de las características de los puntos de referencia es que intenta ejecutar el mismo fragmento de código varias veces para que sea preciso, impulse la aplicación y reduzca los márgenes de error. Como tal, PyPy brilla en estas pruebas.

La desventaja de un compilador JIT, y en particular de PyPy, es el alto costo inicial. Otro inconveniente es la falta de compatibilidad con muchas C-Extensions. Debido a que "Python" (CPython, el Python oficial de PSF) está escrito en C, muchas extensiones de terceros en PyPi aprovechan esto. Numpy sería un buen ejemplo, gran parte de Numpy está escrito en código C optimizado. Cuando pip install numpy , usa su compilador C local y crea una biblioteca binaria para que la use su tiempo de ejecución de Python.

Debido a que PyPy está escrito en Python, muchos módulos simplemente no pueden funcionar en PyPy. Por lo tanto, siempre debe verificar.

Además, PyPy sufre el mismo desafío que CPython: el cambio de la versión 2 del lenguaje a la versión 3. He encontrado que PyPy3 es inestable hasta hace poco y en los puntos de referencia todavía se pueden ver extrañas inconsistencias con PyPy. También he tenido problemas con los paquetes (por ejemplo, PyTest) dejando de admitir PyPy3 mientras solucionan los problemas.

Conclusión

Python 3.7 es el más rápido de los Python "oficiales" y PyPy es la implementación más rápida que probé.

Me encantaría ver que PyPy3 funcione igual de bien, si no mejor, que PyPy en el futuro, ya que Python 2 se usa menos.

¿Sigues atascado en Python 2?

Consulte mi nuevo curso sobre Pluralsight para pasar de Python 2 a 3.