我曾经使用内置于System Monitor应用程序中的漂亮Apple Profiler。只要您的C ++代码是使用调试信息编译的,您就可以对正在运行的应用程序进行采样,并打印出一个缩进的树,告诉您父函数在此函数中花费的时间百分比(以及正文与其他函数调用)
例如,如果主要呼叫function_1
和function_2
,function_2
呼叫function_3
,然后主呼叫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
但与优雅的呼叫树相比,它相当混乱。如果你能轻易做到这一点,请告诉我,这会有所帮助。
答案 0 :(得分:49)
我也偶然发现了这一点,花了一些时间学习如何生成一个调用图(cProfile的正常结果并不是非常有用)。未来参考,这是使用cProfile + gprof2dot + graphViz生成漂亮的调用树图形的另一种方法。
-------
easy_install gprof2dot
在代码上运行配置文件。
python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ...
运行gprof2dot将呼叫配置文件转换为点文件
gprof2dot -f pstats myLog.profile -o callingGraph.dot
使用graphViz打开以显示图表
这是最终结果的样子! 图表采用颜色编码 - 红色意味着更高的时间集中。
答案 1 :(得分:20)
我最近想要同样的事情,所以我自己实施了一个。
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())
答案 2 :(得分:10)
查看此库http://pycallgraph.slowchop.com/以获取呼叫图。它工作得很好。如果您想要分析特定功能,请查看http://mg.pov.lt/blog/profiling.html
这是profilehooks模块的结果。
答案 3 :(得分:0)