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 无法处理调用同一函数的多个函数的主要内容,如果未能解决你的问题,请参考以下文章

001--python全栈--基础知识--python安装

Python代写,Python作业代写,代写Python,代做Python

Python开发

Python,python,python

Python 介绍

Python学习之认识python