python - 如何使用 Python 分析器获取调用树?

标签 python tree profiling

我曾经使用内置于 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

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

最佳答案

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

——————

  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 打开以可视化图表

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

Graph is color-coded- red means higher concentration of time

关于python - 如何使用 Python 分析器获取调用树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4544784/

相关文章:

ruby-on-rails - 如何分析我的 rspec 测试以找到最大的内存消耗?

Python解析查询字符串以列表

css - 带有纯 HTML 和 CSS(或最少 JS)的家谱

python - 在 Jupyter Notebook 中使用 Flask-SQLAlchemy 模型

tree - 如何通过索引获取子树?

JAVACC && JJTree (.jjt) 插入 ||解析两个标记时将符号放入树中

C gperftools - 分析 C 代码

c - gcc -Ofast -pg 的 gprof 结果错误

python - 如何使用 app.yaml 在 GAE(python) 中上传静态文件?

python - ElementTree 是否生成自己的 nsmap,而 lxml.etree 则不生成?