He estado usando cProfile para perfilar mi código y ha funcionado muy bien. También uso gprof2dot.py para visualizar los resultados (lo hace un poco más claro).
Sin embargo, cProfile (y la mayoría de los otros perfiladores de Python que he visto hasta ahora) parecen solo perfilar en el nivel de llamada de función. Esto causa confusión cuando se llaman a ciertas funciones desde diferentes lugares; no tengo idea si la llamada n. ° 1 o la llamada n. ° 2 están ocupando la mayor parte del tiempo. Esto empeora aún más cuando la función en cuestión tiene seis niveles de profundidad, llamada desde otros siete lugares.
¿Cómo obtengo un perfil línea por línea?
En lugar de esto:
function #12, total time: 2.0s
Me gustaría ver algo como esto:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile muestra cuánto del tiempo total se "transfiere" al padre, pero nuevamente esta conexión se pierde cuando tienes un montón de capas y llamadas interconectadas.
Idealmente, me encantaría tener una GUI que analizara los datos y luego me mostrara mi archivo fuente con el tiempo total asignado a cada línea. Algo como esto:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Entonces podría hacer clic en la segunda llamada "func (c)" para ver qué está ocupando tiempo en esa llamada, separada de la llamada "func (a)".
¿Tiene sentido? ¿Existe alguna biblioteca de perfiles que recopile este tipo de información? ¿Hay alguna herramienta increíble que me haya perdido?
pstats.print_callers
. Un ejemplo está aquí .