Python分析 - runsnakerun输出中的列是什么?

eva*_*n54 8 python profiling

这可能非常明显,但只是想确保我理解runsnakerun中的列是什么.

名称,呼叫,RCalls,本地,/呼叫,暨,/呼叫,文件,线路,目录

以下是我认为我理解的一些内容

名称 - 被调用函数的名称

  1. 通话 - 通话次数?
  2. 文件 - 存储函数的文件
  3. Line - 在文件中定义函数的行
  4. 目录 - 具有功能定义的文件目录

剩下的就是那些我不觉得冒险的人:

  1. RCalls
  2. 本地
  3. /呼叫
  4. 附带
  5. /呼叫

谢谢

int*_*skh 7

这是我的理解:

  • RCalls 递归调用的数量
  • Local 在本地执行上花费的总时间(不调用另一种方法)
  • /Call 每次通话的当地时间
  • Cum 总累计时间
  • /Call 每次通话的累计时间


Hen*_*her 6

最好的说明方式是一个例子 - 假设您有以下程序(存储在profileme.py中,但为了清楚起见分成几部分):

def topfunction():
    tinyfunction()
    for i in range(100000):
        manytinyfunction()
Run Code Online (Sandbox Code Playgroud)

调用很简单 - 直接调用此函数的次数.当然,当您选择左侧的项目时,这些数字将会改变,反映所选功能调用该功能的次数. manytinyfunction将被召唤100,000次,因此呼叫将是100,000. tinyfunction将被调用一次,因此其调用将为1.

    for i in range(10):
        recursive(100)
Run Code Online (Sandbox Code Playgroud)

rcalls类似,但它还包括在执行调用时发生的调用.请注意recursive,调用只有10,但rcalls是1010(定义如下,但如果参数为n,则调用自身n次.

    alllocal()
    allcumulative()
Run Code Online (Sandbox Code Playgroud)

类似地,local包括在函数本身中花费的所有时间,而不包括对其他函数的调用.这里alllocal有一个很大的价值,但这里allcumulative没什么,因为它把它的工作放在了subfunction.

def tinyfunction():
    pass

def manytinyfunction():
    pass
Run Code Online (Sandbox Code Playgroud)

/呼叫旁边的地方仅解除上述局部值每次通话了,所以manytinyfunction有一点时间的整体,但在本地/调用一个非常非常小的数目,因为每个呼叫真的很便宜.

def alllocal():
    for i in range(1000):
        for j in range(1000):
            for k in range(1000):
                pass
Run Code Online (Sandbox Code Playgroud)

对于alllocal本地和累积,/ call将是巨大的,因为这个功能是如此昂贵,并且所有费用都是本地的.

def allcumulative():
    for i in range(1000):
        subfunction()

def subfunction():
    for j in range(1000):
        for k in range(1000):
            pass
Run Code Online (Sandbox Code Playgroud)

累计旁边/ Call与本地的/ call相同,除了像累积本身一样,它包含从函数本身包含的所有调用的全部成本.所以本地/电话号码很小allcumulative,但很大alllocal.累积/调用不是这样,在两种情况下都是相同的.

def recursive(n):
    if n > 0:
        return recursive(n-1)
    else:
        return 0
Run Code Online (Sandbox Code Playgroud)

提供的定义recursive是为了完整性

if __name__=="__main__":
    topfunction()
Run Code Online (Sandbox Code Playgroud)

在分析它并运行runsnake之后:

python -m cProfile -o profileme.out profileme.py 
runsnake profileme.out
Run Code Online (Sandbox Code Playgroud)

所以,请注意,alllocal本地和累积的价值都很大,而且allcumulative差别很大.请注意,recursive两列中都是相同的 - 对自己的调用会被计算在内.

底部的"Callees"按钮可让您确定所选功能正在调用的其他功能,而" 呼叫者"可让您确定谁在调用所选功能.

  • 这是否更好?我已经穿插了代码和评论,并试图澄清 (2认同)