【问题标题】:Python profiling - What are the columns in runsnakerun output?Python 分析 - runsnakerun 输出中的列是什么?
【发布时间】:2014-05-02 02:46:14
【问题描述】:

这可能真的很明显,但只是想确保我了解 runnakerun 中的列。

姓名、呼叫、RCalls、本地、/Call、Cum、/Call、文件、线路、目录

这里有一些我认为我理解的

名称 - 被调用函数的名称

  1. 通话 - 通话次数?
  2. 文件 - 存储函数的文件
  3. 行 - 文件中定义函数的行
  4. 目录 - 包含函数定义的文件目录

其余的让我不敢冒险猜测:

  1. RCalls
  2. 本地
  3. /打电话
  4. 暨
  5. /打电话

谢谢

【问题讨论】:

  • 你看过我的回答了吗?它包含一个示例,可以更轻松地了解不同列在实践中的工作方式...

标签: python profiling


【解决方案1】:

这是我的理解:

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

【讨论】:

  • 虽然我明白为什么赏金需要更多细节,但这肯定回答了问题!
【解决方案2】:

最好的说明方法是举个例子——假设你有以下程序(存储在 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的calls只有10,而rcalls是1010(定义如下,但是如果参数是n,它会调用自己n次。

    alllocal()
    allcumulative()

同样,local 包括函数本身所花费的所有时间,不包括对其他函数的调用。这里alllocal 在这里有很大的价值,但是allcumulative 这里什么都没有,因为它把它的工作转移到subfunction 上。

def tinyfunction():
    pass

def manytinyfunction():
    pass

local 旁边的 /Call 只是简单地将上面的 local 值分解为每次调用,因此 manytinyfunction 总体上只有一点时间,但在本地 /call 中的数字非常小,因为每次通话真的很便宜。

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

/call 旁边的/call 与 local 的 /call 相同,不同之处在于,它与cumulative 本身一样,包含函数本身的所有调用的全部成本。所以本地/电话号码对于allcumulative 来说很小,但对于alllocal 来说很大。累积的 /call 则不是这样,这在两种情况下都是一样的。

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 在两列中是相同的——对您自己的调用被计算在内。

底部的 Callees 按钮可让您确定所选函数正在调用哪些其他函数,而 Callers 可让您确定谁在调用所选函数。 p>

【讨论】:

  • 您能否将答案格式化为更具可读性,也许将文本移到代码上方?老实说,我从来没有轻松地度过这一切。信息似乎有点复杂。
  • 我认为最好的答案看起来像 @interskh 的例子,在每个项目下方评论,就像你试图做的那样,有意义吗?
  • 这样更好吗?我已经穿插了代码和cmets,并试图澄清
  • 是的好多了。我认为,如果您在功能和调用等中添加突出显示和强调,那将是完美的并且会接受
  • 我突出显示了函数引用,并在第一次讨论 UI 的特定部分时加粗了——突出显示它们看起来都像愤怒的水果沙拉。享受
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2016-05-25
  • 2023-02-11
相关资源
最近更新 更多