python cProfile/snakeviz 无法处理调用同一函数的多个函数
Posted
技术标签:
【中文标题】python cProfile/snakeviz 无法处理调用同一函数的多个函数【英文标题】:python cProfile/snakeviz can't handle multiple functions calling same function 【发布时间】:2018-05-20 16:17:13 【问题描述】:我在解释 cProfile
数据时遇到问题。为了向您展示我的问题,我创建了这个简单的脚本。
函数 D 调用 B 和 C,它们都调用 A。 功能 A 显然需要 1 秒(+开销)。 如果我们查看snakeviz 结果,您会发现报告有点奇怪。我知道函数 A 总共花费了 2 秒,但在函数 C 内部,函数 A 只花费了 1 秒,这就是我感兴趣的。有谁知道是否有一个设置(或不同的查看器)在哪里我没有这个问题?
import time
import cProfile
def A():
time.sleep(1)
def B():
A()
def C():
A()
def D():
B()
C()
cProfile.run('D()','profileResults.prf')
snakeviz results
【问题讨论】:
当您分析函数D()
时,函数A()
被间接调用2 次,这就是它显示2 秒的原因。函数 C()
仅从 D()
调用一次。从函数C()
开始,函数A()
也只被调用一次。因此函数C()
时间应该是1秒。如果你单独分析函数C()
,你将得到 1 秒的时间。
感谢您的回答。它确实没有显示错误的信息,在这种情况下,可以单独分析功能 C 或 D。然而,在更复杂的项目中,这是不可能的。一旦你的代码深入到多个层次,就不可能确定在一个函数中花费了多少时间。我发现了一些稍微好一点的东西:ymichael.com/2014/03/08/profiling-python-with-cprofile.html
【参考方案1】:
不幸的是,Python 配置文件没有存储整个调用树。 (这太贵了。)我已经记录了问题here 和snakeviz issue。
我最近创建了 tuna 用于可视化 Python 配置文件以解决其中一些问题。 tuna 无法显示整个调用树,但至少它也不会显示错误信息。
安装
pip3 install tuna
创建运行时配置文件
python -mcProfile -o program.prof yourfile.py
然后在文件上运行 tuna
tuna program.prof
【讨论】:
以上是关于python cProfile/snakeviz 无法处理调用同一函数的多个函数的主要内容,如果未能解决你的问题,请参考以下文章