tutorial - Probando con precisión el rendimiento de Pypy vs CPython
pypy tutorial (2)
No está del todo claro lo que está tratando de medir. "Rendimiento" puede significar una variedad de cosas dependiendo de su caso de uso.
- ¿Está tratando de medir la velocidad bruta de la función una vez que todo se ha calentado (en particular, JIT pero también las importaciones de bibliotecas, la carga de archivos, etc.)? Entonces probablemente querrás
--repeat
mucho como Haroldo_OK sugirió. Con suficientes repeticiones, el tiempo empleado en otras partes de su código se volverá progresivamente "insignificante". - ¿Está midiendo cosas por aprender o para un caso de uso en el mundo real? Si es lo último, probablemente sea una buena idea probar su código en condiciones similares (longitud de las cadenas que está pasando a su función, número de iteraciones, llamadas de su código en caliente / en frío ...). Mi impresión es que usar la interfaz de Python en lugar de la CLI le daría más flexibilidad para medir exactamente lo que está buscando.
Cabe destacar que timeit
desactiva la recolección de basura , por lo que si está buscando medidas del "mundo real", tal vez quiera volver a encenderlo (consulte el enlace para saber cómo hacerlo).
Si está intentando mejorar la velocidad, usar un generador de perfiles como cProfile que es compatible con Python3.6 y pypy podría ayudar a aislar el código cuya velocidad desea medir.
En realidad no estoy respondiendo tu pregunta, pero espero que te ayude :)
La descripción del problema:
Tengo esta función de "suma de comprobación" personalizada:
NORMALIZER = 0x10000
def get_checksum(part1, part2, salt="trailing"):
"""Returns a checksum of two strings."""
combined_string = part1 + part2 + " " + salt if part2 != "***" else part1
ords = [ord(x) for x in combined_string]
checksum = ords[0] # initial value
# TODO: document the logic behind the checksum calculations
iterator = zip(ords[1:], ords)
checksum += sum(x + 2 * y if counter % 2 else x * y
for counter, (x, y) in enumerate(iterator))
checksum %= NORMALIZER
return checksum
Lo que quiero probar tanto en Python3.6 como en PyPy en cuanto al rendimiento. Me gustaría ver si la función funcionaría mejor en PyPy, pero no estoy completamente seguro de cuál es la forma más confiable y limpia de hacerlo.
Lo que he probado y la pregunta:
Actualmente, estoy usando timeit
para ambos:
$ python3.6 -mtimeit -s "from test import get_checksum" "get_checksum(''test1'' * 100000, ''test2'' * 100000)"
10 loops, best of 3: 329 msec per loop
$ pypy -mtimeit -s "from test import get_checksum" "get_checksum(''test1'' * 100000, ''test2'' * 100000)"
10 loops, best of 3: 104 msec per loop
Mi preocupación es que no estoy absolutamente seguro de si timeit
es la herramienta adecuada para el trabajo en PyPy
debido a la sobrecarga de calentamiento de JIT .
Además, el propio PyPy informa lo siguiente antes de informar los resultados de la prueba:
WARNING: timeit is a very unreliable tool. use perf or something else for real measurements
pypy -m pip install perf
pypy -m perf timeit -s ''from test import get_checksum'' "get_checksum(''test1'' * 1000000, ''test2'' * 1000000)"
¿Cuál sería el mejor y más preciso enfoque para probar el mismo rendimiento de la función en estas y potencialmente otras implementaciones de Python?
Podría aumentar el número de repeticiones con el parámetro --repeat
para mejorar la precisión de tiempo. ver: