在Python中增加cProfiler的深度以报告更多功能?
我正在尝试分析调用其他函数的函数。我将分析器称为如下:
from mymodule import foo
def start():
# ...
foo()
import cProfile as profile
profile.run('start()', output_file)
p = pstats.Stats(output_file)
print "name: "
print p.sort_stats('name')
print "all stats: "
p.print_stats()
print "cumulative (top 10): "
p.sort_stats('cumulative').print_stats(10)
我发现分析器说所有的时间都花在了mymodule的函数“foo()”上,而不是把它放到子函数foo()调用中,这就是我想要看到的。如何让分析器报告这些功能的性能?
谢谢。
没有找到相关结果
已邀请:
3 个回复
究补闯
才能获得方法调用的分层细分。输出是非常自我解释的:在左栏中,您可以找到您感兴趣的功能,例如ѭ2,然后转到右侧列显示所有被调用的子功能及其范围总计和累计时间。这些子呼叫的故障也包括在内等。
爆刺疤灯
调用的函数从列表的底部掉了下来。 我决定玩一些大数字进行测试。这是我的测试代码:
包含文件(与Asker非常相似):
注意最后一行。我添加了一个按
排序的视图,这是在函数“不包括调用子函数的时间”中花费的总时间。我发现这个视图更有用,因为它倾向于支持正在进行实际工作的函数,并且可能需要优化。 以下是Asker工作的结果部分(
-sorted):
了解此显示中的前3个函数仅被调用一次。让我们看看
排序的视图:
现在排名第一的条目是有道理的。显然,通过重复乘法将东西提升到200倍的力量是一种“天真”的策略。我们来取代它:
结果如下:
这是一个很好的改进。现在
是我们最糟糕的罪犯。我在
中添加了一行来打印数字的长度,因为我的第一次尝试(只是计算数字并且不做任何事情)得到了优化,我试图避免这种情况(打印数字,真的非常快) )好像它可能阻塞I / O,所以我在打印数字的长度时妥协了。嘿,这是基数10日志。我们试试看:
结果如下:
嗯,即使没有
,仍然花费相当多的时间在
。让我们摆脱那个印刷品:
结果如下:
现在看起来做实际工作的东西是最繁忙的功能,所以我认为我们已经完成了优化。 希望有所帮助!
bab
最终的分析输出仅包含
调用。我花了不少时间意识到我有空循环分析。当然,客户端代码中有多个来自
的调用,但是有意义的分析结果已被最后一个带有空循环的调用覆盖。