He estado usando cProfile para perfilar mi código, y ha estado funcionando muy bien. También uso gprof2dot.py para visualizar los resultados (lo hace un poco más claro).¿Cómo puedo crear un perfil de código python línea por línea?
Sin embargo, cProfile (y la mayoría de los demás perfiles de python que he visto hasta ahora) parecen tener solo un perfil en el nivel de llamada de función. Esto causa confusión cuando se llaman ciertas funciones desde diferentes lugares. No tengo idea si la llamada n. ° 1 o la n. ° 2 ocupan la mayor parte del tiempo. Esto empeora cuando la función en cuestión tiene 6 niveles de profundidad, llamada desde 7 otros lugares.
Entonces mi pregunta es: ¿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 sí muestra cómo gran parte del tiempo total de "transferencias" a los padres, pero de nuevo se pierde esta conexión cuando tienes un montón de capas y llamadas interconectadas.
Idealmente, me encantaría tener una GUI que analizara los datos, luego muéstreme el archivo fuente con un 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 yo sería capaz de hacer clic en el segundo "func (c)" llamado a ver lo que está tomando el tiempo en que la llamada, separado de la "func (a)" llamada.
¿Tiene sentido? ¿Hay alguna biblioteca de creación de perfiles que recopile este tipo de información? ¿Hay alguna herramienta increíble que me he perdido? Cualquier comentario es apreciado. ¡¡Gracias!!
Mi conjetura es que usted estaría interesado en 'pstats.print_callers'. Un ejemplo es [aquí] (http://www.doughellmann.com/PyMOTW/profile/). –
Muhammad, ¡eso definitivamente es útil! Al menos soluciona un problema: separar las llamadas de funciones según el origen. Creo que la respuesta de Joe Kington está más cerca de mi objetivo, pero print_callers() definitivamente me lleva a la mitad. ¡Gracias! – rocketmonkeys