<p>最好的方法是用一个示例来说明,假设您有以下程序(存储在简介.py,但为了清晰起见,将其分成几部分):</p>
<pre><code>def topfunction():
tinyfunction()
for i in range(100000):
manytinyfunction()
</code></pre>
<p><strong>调用</strong>很简单这个函数被直接调用了多少次。当然,当您选择左侧的项时,这些数字将发生变化,反映所选函数调用函数的次数。<code>manytinyfunction</code>将被调用100000次,因此调用次数为100000次。<code>tinyfunction</code>将被调用一次,因此它的调用将为1。在</p>
^{pr2}$
<p><strong>r调用</strong>类似,但也包括执行调用时发生的调用。请注意,<code>recursive</code>调用的值仅为10,但rcalls为1010(定义如下,但如果参数为n,则调用自身n次)</p>
<pre><code> alllocal()
allcumulative()
</code></pre>
<p>类似地,<strong>local</strong>包括在函数本身上花费的所有时间,不包括对其他函数的调用。这里<code>alllocal</code>在这里有一个很大的值,但是{<cd5>}在这里没有任何值,因为它把它的工作放在<code>subfunction</code>上。在</p>
<pre><code>def tinyfunction():
pass
def manytinyfunction():
pass
</code></pre>
<p>local</strong>旁边的<strong>/调用只会在每次调用中分解上面的本地值,因此<code>manytinyfunction</code>总体上有一点时间,但是local/Call中的一个非常小的数字,因为每个调用都非常便宜。在</p>
<pre><code>def alllocal():
for i in range(1000):
for j in range(1000):
for k in range(1000):
pass
</code></pre>
<p>对于<code>alllocal</code>,无论是本地调用还是累积调用,都将是巨大的,因为这个函数非常昂贵,而且所有的开销都是本地的。在</p>
<pre><code>def allcumulative():
for i in range(1000):
subfunction()
def subfunction():
for j in range(1000):
for k in range(1000):
pass
</code></pre>
<p>cumulative旁边的<strong>/调用与local的/Call相同,只是与cumulative本身一样,它包含从函数本身发出的所有调用的全部开销。因此,<code>allcumulative</code>的本地/呼叫号码很小,<code>alllocal</code>的本地/呼叫号码却很大。对于累积/调用则不是这样,这两种情况下都是相同的。在</p>
<pre><code>def recursive(n):
if n > 0:
return recursive(n-1)
else:
return 0
</code></pre>
<p>提供<code>recursive</code>的定义是为了完整性</p>
<pre><code>if __name__=="__main__":
topfunction()
</code></pre>
<p>分析并运行runsnake之后:</p>
<pre><code>python -m cProfile -o profileme.out profileme.py
runsnake profileme.out
</code></pre>
<p>因此,请注意,<code>alllocal</code>对于局部和累积都有很大的值,其中as<code>allcumulative</code>是截然不同的。请注意,<code>recursive</code>在这两列中是相同的,对您自己的调用都是计数的。在</p>
<p>底部的<strong>调用者</strong>按钮可让您了解所选函数正在调用的其他函数,而<strong>调用者</strong>可让您确定谁在调用所选函数。在</p>