La descripción del problema:
Tengo esta función personalizada de "suma de comprobación":
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 checksumQue 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 intentado 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 posible sobrecarga de calentamiento 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 enfoque mejor y más preciso para probar exactamente el mismo rendimiento de la función en estas y potencialmente otras implementaciones de Python?
Puede aumentar la cantidad de repeticiones con el parámetro --repeat para mejorar la precisión del tiempo. ver:
No está del todo claro lo que está tratando de medir. "Rendimiento" puede significar una variedad de cosas según su caso de uso.
--repeat mucho como sugirió Haroldo_OK. Con suficientes repeticiones, el tiempo dedicado a otras partes de su código se volvería progresivamente "insignificante". Cabe destacar que timeit desactiva la recolección de basura , por lo que si está buscando medidas del "mundo real", tal vez desee volver a activarlo (consulte el enlace para saber cómo hacerlo).
Si está tratando de 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 a tu pregunta, pero espero que te ayude :)