Python中的分析:谁调用了函数?

Ram*_*hum 50 python profiling

我正在使用Python进行分析cProfile.我发现一个占用大量CPU时间的函数.我如何找出哪个函数调用这个重函数最多?

编辑:

我会解决一个解决方法:我可以在那个重函数中编写一个Python行,它将打印调用它的函数的名称吗?

dbr*_*dbr 106

我几乎总是使用Gprof2dot查看cProfile模块的输出,基本上它将输出转换为graphvis图(.dot文件),例如:

示例gprof2dot输出

它可以很容易地确定哪个函数最慢,哪个函数调用它.

用法是:

python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
Run Code Online (Sandbox Code Playgroud)

  • +1这是F********令人印象深刻和令人惊叹的!谢谢你向我展示..哇.. (5认同)
  • 看起来像一个很酷的工具,将不得不试试这个;-) (2认同)
  • 如果要像使用cProfile.run(exp)一样分析表达式,则可以使用它(仍然创建一个临时pstats文件):def run(exp,output =“ profile.png”,statsFileName =“ stats.pstats”) :导入cProfile cProfile.run(exp,statsFileName)os.system(“ python gprof2dot.py -f pstats%s |点-Tpng -o%s> / dev / null 2>&1”%(statsFileName,输出)) (2认同)

Nad*_*mli 34

这可能不会直接回答你的问题,但肯定会有所帮助.如果使用带有选项--sort cumulative的探查器,它将按累计时间对函数进行排序.这不仅有助于检测繁重的功能,还可以检测调用它们的功能.

python -m cProfile --sort cumulative myScript.py
Run Code Online (Sandbox Code Playgroud)

有一个解决方法来获取调用函数:

import inspect
print inspect.getframeinfo(inspect.currentframe().f_back)[2]
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的f_back,以防您需要调用者调用者等.如果您想计算频繁调用,可以执行以下操作:

record = {}

caller = inspect.getframeinfo(inspect.currentframe().f_back)[2]
record[caller] = record.get(caller, 0) + 1
Run Code Online (Sandbox Code Playgroud)

然后按频率顺序打印:

print sorted(record.items(), key=lambda a: a[1])
Run Code Online (Sandbox Code Playgroud)

  • 如果将cProfile的结果保存到文件并使用`pstats`模块加载配置文件,那么你可以直接查询重函数的调用者:`loaded_stats_object.print_callers('heavy_function')` (3认同)

Ign*_*ams 10

inspect.stack()将为您提供当前的调用者堆栈.