¿Cómo se puede obtener el árbol de llamadas con perfiladores de Python?

Solía ​​usar un buen generador de perfiles de Apple integrado en la aplicación System Monitor. Siempre que su código de C ++ se haya comstackdo con información de depuración, puede muestrear su aplicación en ejecución e imprimiría un árbol con sangría que le indicará qué porcentaje del tiempo de la función principal se gastó en esta función (y el cuerpo frente a otras llamadas de función) .

Por ejemplo, si main se llama function_1 y function_2 , function_2 llama function_3 , y luego main llama 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) 

Vería esto y pensaría: “Algo está tomando mucho tiempo en el código en el cuerpo de function_2 . Si quiero que mi progtwig sea más rápido, ahí es donde debería comenzar”.

¿Cómo puedo obtener más fácilmente esta salida de perfil exacta para un progtwig 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 ese elegante árbol de llamadas. Por favor, hágame saber si puede hacer esto fácilmente, ayudaría bastante.

    Consulte esta biblioteca http://pycallgraph.slowchop.com/ para ver los gráficos de llamadas. Funciona muy bien. Si desea crear perfiles de funciones específicas, visite http://mg.pov.lt/blog/profiling.html

    Este es un resultado del módulo profilehooks.

    texto alternativo

    También me tropecé con esto, y pasé un tiempo aprendiendo cómo generar un gráfico de llamadas (los resultados normales de cProfile no son terriblemente informativos). Referencia futura, aquí hay otra forma de generar un hermoso gráfico de call-tree con cProfile + gprof2dot + graphViz.

    ———————

    1. Instale GraphViz: http://www.graphviz.org/Download_macos.php
    2. easy_install gprof2dot
    3. Ejecutar perfil en el código.

       python -m cProfile -o myLog.profile  arg1 arg2 ... 
    4. Ejecute gprof2dot para convertir el perfil de llamada en un archivo de puntos

       gprof2dot -f pstats myLog.profile -o callingGraph.dot 
    5. Abrir con graphViz para visualizar la gráfica.

    ¡Así es como se vería el resultado final! El gráfico está codificado por colores: el rojo significa una mayor concentración de tiempo.

    El gráfico está codificado por colores: rojo significa mayor concentración de tiempo

    Hace poco quería lo mismo, así que intenté implementarlo yo mismo.

    El proyecto está en GitHub, https://github.com/joerick/pyinstrument

    Así es como lo usarías:

     from pyinstrument import Profiler profiler = Profiler() profiler.start() # Code you want to profile profiler.stop() print(profiler.output_text()) 

    El enfoque gprof2dot extrae toda la información muy bien, así que soy un fan. Sin embargo, a veces quiero ver los datos de tiempo en un árbol de llamadas, así que creé atún .

    introduzca la descripción de la imagen aquí

    Instalar con

     pip install tuna 

    y mostrar su perfil con

     tuna program.prof 

    El atún está inspirado en SnakeViz .