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

时间:2014-05-02 02:46:14

标签: python profiling

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

姓名,电话,RCalls,本地电话,/电话,暨电话,/电话,档案,线路,目录

以下是我认为理解的一些

名称 - 被调用函数的名称

  1. 通话 - 通话次数?
  2. 文件 - 存储功能的文件
  3. 行 - 文件中定义函数的行
  4. 目录 - 具有功能定义的文件目录
  5. 我觉得不舒服的是其他人:

    1. RCalls
    2. 本地
    3. /呼叫
    4. 射精
    5. /呼叫
    6. 由于

2 个答案:

答案 0 :(得分:7)

以下是我的理解:

  • RCalls递归电话数
  • Local本地执行所花费的总时间(不调用其他方法)
  • /Call每次通话的当地时间
  • Cum总累计时间
  • /Call每次通话累计时间

答案 1 :(得分:6)

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

def topfunction():
    tinyfunction()
    for i in range(100000):
        manytinyfunction()

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

    for i in range(10):
        recursive(100)

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

    alllocal()
    allcumulative()

同样,本地包括在函数本身中花费的所有时间,而不包括对其他函数的调用。此处alllocal的值很大,但allcumulative此处没有任何内容,因为它将其工作转移到subfunction上。

def tinyfunction():
    pass

def manytinyfunction():
    pass

本地旁边的 /呼叫只会打破每次呼叫上方的本地值,因此manytinyfunction总体上有一点时间,但本地/呼叫中的数字非常小,因为每次通话都很便宜。

def alllocal():
    for i in range(1000):
        for j in range(1000):
            for k in range(1000):
                pass

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

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

def subfunction():
    for j in range(1000):
        for k in range(1000):
            pass

/累计旁边的呼叫与本地的/呼叫相同,不同之处在于,与累积本身一样,它具有从包含的功能本身发出的所有呼叫的全部费用。因此allcumulative的本地/电话号码很小,但alllocal的号码很大。累积/调用不是这样,在两种情况下都是相同的。

def recursive(n):
    if n > 0:
        return recursive(n-1)
    else:
        return 0

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

if __name__=="__main__":
    topfunction()

对其进行分析并运行runsnake:

python -m cProfile -o profileme.out profileme.py 
runsnake profileme.out

因此,请注意alllocal对于本地和累积都有较大的值,而allcumulative则明显不同。请注意,recursive在两列中都相同 - 对自己的调用都会计算在内。

底部的被忽略按钮可让您找出所选功能正在呼叫的其他功能,而来电者可让您找出所选择的人员是谁功能