Python cProfile/snakeviz无法处理多个函数调用同一函数

4
我在解释数据时遇到了问题。为了向您展示我的问题,我创建了这个简单的脚本。
函数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结果


由于您正在对函数D()进行分析,其中函数A()间接调用了2次,因此显示了2秒钟。从函数D()中仅调用一次函数C()。 从函数C()中,也仅调用一次函数A()。因此,函数C()的时间应为1秒钟。如果您单独分析函数C(),则将在所有地方获得1秒钟。 - Soumendra
谢谢你的回答。事实上,它确实没有显示错误的信息,在这种情况下,人们可以单独对函数C或D进行分析。然而,在更复杂的项目中,这是不可能的。一旦你的代码嵌套多层,就无法确定在一个函数中花费了多少时间。我找到了一些做得稍微好一些的东西:https://ymichael.com/2014/03/08/profiling-python-with-cprofile.html - Matthias Baert
1个回答

7
不幸的是,Python剖析器无法存储整个调用树(这将太昂贵)。我已经在这里记录了这个问题,并作为snakeviz问题。最近,我创建了tuna,用于可视化Python剖析文件以解决其中一些问题。 tuna无法显示整个调用树,但至少它不会显示错误信息。安装命令如下:
pip3 install tuna

创建运行时配置文件。
python -m cProfile -o program.prof yourfile.py

只需在文件上运行tuna即可。
tuna program.prof

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接