Solía usar un buen generador de perfiles de Apple que está integrado en la aplicación Monitor del sistema. Siempre que su código C++ haya sido compilado con información de depuración, podrá muestrear la aplicación en ejecución e imprimir un árbol con sangría que le indicará qué porcentaje del tiempo de la función padre se gastó en esta función (y el cuerpo frente a otras llamadas a función) .¿Cómo se puede obtener el árbol de llamadas con los perfiles de python?
Por ejemplo, si principal llamado function_1
y function_2
, function_2
llamadas function_3
, y luego llama principales function_3
:
main (100%, 1% in function body):
function_1 (9%, 9% in function body):
function_2 (90%, 85% in function body):
function_3 (100%, 100% in function body)
function_3 (1%, 1% in function body)
me gustaría ver esto y pensar, "Algo está tomando mucho tiempo en el código en el cuerpo de function_2
. Si quiero que mi programa sea más rápido, ahí es donde debería comenzar ".
¿Alguien sabe cómo puedo obtener más fácilmente esta salida de perfil exacta para un programa de Python?
He visto a gente decir que hacer esto:
import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main(argv)", globals(), locals())
stats = pstats.Stats(prof)
stats.sort_stats("time") # Or cumulative
stats.print_stats(80) # 80 = how many to print
pero es bastante complicado en comparación con el árbol de llamadas elegante. Por favor, avíseme si puede hacer esto fácilmente, sería bastante útil.
¡Salud!
¿Sabe usted si este paquete pueden hacer transcurrido el tiempo, así como el número de llamadas a la función? Por ejemplo, no me importaría llamar a __hash __() miles de veces, pero llamar ordenado() repetidamente en listas grandes podría ser bastante lento. – user
Deberías probar ambos. Básicamente hacen lo mismo de diferentes maneras con diferentes salidas. – Falmarri
+1, el paquete está en línea con lo que tenía en mente y fue rápido y fácil de instalar y llamar. ¿Te importa decirme cómo obtuviste la figura anterior? Hice un gráfico (usando pycallgraph.start_trace() y pycallgraph.make_dot_graph ('test.jpg', format = 'jpg', tool = 'neato') ), pero está demasiado lleno y se oscurecen muchas funciones. – user