最好的说明方法是举个例子——假设你有以下程序(存储在 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>