【问题标题】:How can you get the call tree with Python profilers?如何使用 Python 分析器获取调用树?
【发布时间】:2010-12-28 08:46:35
【问题描述】:

我曾经使用内置于 System Monitor 应用程序中的一个不错的 Apple 分析器。只要您的 C++ 代码是使用调试信息编译的,您就可以对正在运行的应用程序进行采样,它会打印出一个缩进的树,告诉您父函数在此函数中花费的时间百分比(以及主体与其他函数调用) .

例如,如果main调用function_1function_2function_2调用function_3,然后main调用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)

我会看到这个并想,“function_2 正文中的代码需要很长时间。如果我希望我的程序更快,那就应该从那里开始。”

我怎样才能最轻松地获得 Python 程序的准确分析输出?

我看到有人说要这样做:

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

但与那个优雅的调用树相比,它相当混乱。如果您可以轻松做到这一点,请告诉我,这会有所帮助。

【问题讨论】:

    标签: python tree profiling


    【解决方案1】:

    我也只是偶然发现了这一点,并花了一些时间学习如何生成调用图(cProfile 的正常结果并不是很丰富)。未来参考,这是另一种使用 cProfile + gprof2dot + graphViz 生成漂亮的调用树图形的方法。

    ——————

    1. 安装 GraphViz:http://www.graphviz.org/Download_macos.php
    2. easy_install gprof2dot
    3. 在代码上运行配置文件。

      python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ...
      
    4. 运行 gprof2dot 将呼叫配置文件转换为点文件

      gprof2dot -f pstats myLog.profile -o callingGraph.dot
      
    5. 使用 graphViz 打开以可视化图表

    这就是最终结果的样子! 图表采用颜色编码 - 红色表示时间集中度更高。

    【讨论】:

    • xdot 是一个不错的 .dot 文件交互式查看器,可让您放大内容。
    • 可以在 Unix 上显示 .dot 文件,使用类似“dot callingGraph.dot -Tpng | display”的 shell 命令代替第 5 步。
    • 很好的答案,正是我想要的,谢谢!
    【解决方案2】:

    我最近也想要同样的东西,所以我尝试自己实现一个。

    项目在 GitHub 上,https://github.com/joerick/pyinstrument

    您将如何使用它:

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

    【讨论】:

    【解决方案3】:

    查看此库 http://pycallgraph.slowchop.com/ 以获取调用图。它真的很好用。如果您想分析特定功能,请查看http://mg.pov.lt/blog/profiling.html

    这是 profilehooks 模块的结果。

    【讨论】:

    • 你知道这个包是否可以做经过时间和函数调用的次数吗?例如,我不介意调用 __hash__() 数千次,但在大型列表上重复调用 sorted() 可能会很慢。
    • 你应该试试他们两个。他们基本上以不同的方式用不同的输出做同样的事情。
    • +1,该软件包符合我的想法,并且安装和调用快捷方便。你介意告诉我你是怎么得到上图的吗?我做了一个图表(使用 pycallgraph.start_trace() 和 pycallgraph.make_dot_graph('test.jpg', format='jpg', tool='neato') ),但它太拥挤了,很多功能都被遮挡了。跨度>
    • 在我看来,它就像RunSnakeRun 的屏幕截图。 profilehooks 只是一堆包装 cProfiler 以便于使用的装饰器。
    • 注意:pycallgraph 现已取消维护
    【解决方案4】:

    gprof2dot 方法可以很好地提取所有信息,所以我是粉丝。但是,有时我想在调用树中查看时序数据,所以我创建了tuna

    安装

    pip install tuna
    

    并显示您的个人资料

    tuna program.prof
    

    【讨论】:

    • 喜欢这个分析器!很容易找到我的瓶颈函数,这符合我的直觉。所以金枪鱼工具 5 星
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多