Python性能分析:谁调用了这个函数?
我在用 cProfile
这个工具分析 Python 程序的性能。发现有一个函数消耗了很多 CPU 时间。我想知道是哪个函数调用了这个耗时的函数最多。
补充:
我可以接受一个变通的方法:我能不能在这个耗时的函数里写一行 Python 代码,打印出调用它的函数的名字?
8 个回答
10
inspect.stack() 这个函数可以让你查看当前的调用栈。
119
我几乎总是通过 Gprof2dot 来查看 cProfile 模块的输出。简单来说,它会把输出转换成一个图形文件(.dot 文件),比如下面这个例子:
这样一来,我们就很容易找出哪个函数运行得最慢,以及是哪个函数调用了它。
使用方法是:
python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
36
这可能不是直接回答你的问题,但肯定会有帮助。如果你使用分析工具,并选择 --sort cumulative 这个选项,它会根据累计时间来排序函数。这对找出不仅是耗时的函数,还有调用这些函数的其他函数也很有帮助。
python -m cProfile --sort cumulative myScript.py
有一种方法可以获取调用函数的信息:
import inspect
print inspect.getframeinfo(inspect.currentframe().f_back)[2]
你可以根据需要添加多个 f_back,来获取调用者的调用者等等。如果你想计算频繁调用的情况,可以这样做:
record = {}
caller = inspect.getframeinfo(inspect.currentframe().f_back)[2]
record[caller] = record.get(caller, 0) + 1
然后按调用频率的顺序打印它们:
print sorted(record.items(), key=lambda a: a[1])