Python性能分析:谁调用了这个函数?

58 投票
8 回答
21209 浏览
提问于 2025-04-15 11:29

我在用 cProfile 这个工具分析 Python 程序的性能。发现有一个函数消耗了很多 CPU 时间。我想知道是哪个函数调用了这个耗时的函数最多。

补充:

我可以接受一个变通的方法:我能不能在这个耗时的函数里写一行 Python 代码,打印出调用它的函数的名字?

8 个回答

10

inspect.stack() 这个函数可以让你查看当前的调用栈。

119

我几乎总是通过 Gprof2dot 来查看 cProfile 模块的输出。简单来说,它会把输出转换成一个图形文件(.dot 文件),比如下面这个例子:

example gprof2dot output

这样一来,我们就很容易找出哪个函数运行得最慢,以及是哪个函数调用了它。

使用方法是:

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])

撰写回答