¿Cuál es el método confiable para encontrar parte del código que consume más tiempo?

A lo largo de mi código fuente, bash capturar y medir el tiempo de lanzamiento de un segmento en Python. ¿Cómo puedo medir el tiempo de paso de ese segmento de manera conveniente con buena precisión?

Utilice un perfilador .

El cProfile de Python está incluido en la biblioteca estándar.

Para una manera aún más conveniente, utilice el paquete profilestats . Luego puede usar un decorador para decorar las funciones que desea perfilar:

 from profilestats import profile @profile def my_function(args, etc): pass 

Esto hará que se imprima un resumen como este en STDOUT:

  6 function calls in 0.026 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.026 0.026 some_code.py:3(some_func) 2 0.019 0.010 0.026 0.013 some_code.py:9(expensive_func) 2 0.007 0.003 0.007 0.003 {range} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 

Sin embargo, la información mucho más útil se encuentra en el archivo cachegrind.out.profilestats generado. Puede abrir este archivo con una herramienta que puede visualizar las estadísticas de almacenamiento en caché, por ejemplo, RunSnakeRun y ser agradable, fácil (o más fácil) para leer visualizaciones de su stack de llamadas de esta manera:

RunSnakeRun

Actualización : las solicitudes de extracción de profilestats y pyprof2calltree se han fusionado, por lo que ahora también son compatibles con Python 3.x.