【发布时间】:2014-07-24 18:21:42
【问题描述】:
我开始学习 Python,很快发现循环、函数调用和这类事情有很多开销。我发现配置文件模块非常有用,但它似乎只显示函数调用而不是基本操作。例如:
import profile
def funct(n):
myrange = range(n)
for i in myrange:
for j in myrange:
pass
profile.run("funct(10000)")
产生以下输出:
5 function calls in 2.556 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(range)
1 0.001 0.001 0.001 0.001 :0(setprofile)
1 0.000 0.000 2.555 2.555 <string>:1(<module>)
1 0.000 0.000 2.556 2.556 profile:0(funct(10000))
0 0.000 0.000 profile:0(profiler)
1 2.555 2.555 2.555 2.555 profiler.py:3(funct)
实际上几乎没有函数调用,但时间仍然很长。此外,用“a == b”之类的简单语句替换通过线会进一步延长计算时间(在本例中为 8.4 秒)。
是否有可能从探查器中获取更多关于函数调用运行时的信息?如果没有,还有什么我可以用来获取更多分析信息的东西吗? (比如我使用了多少比较操作,赋值等)
真的,我看到我的程序的总运行时间是 2.555 秒,但分析列表的所有总时间加起来只有 0.001。我想看看其他时间都去哪儿了。我也会将此应用于更复杂的代码,而不是这个简单的示例。我已尝试搜索有关此的信息,但我找不到任何东西(或者我正在寻找错误的东西)。
最后,我想使用这些信息来查找有关我的代码中的瓶颈的更详细信息。尝试以我刚才询问的方式从分析中获得更多信息可能不是正确的方法,所以如果我可以做更好的事情,请随时解决这个问题。
【问题讨论】:
-
您获得的输出只是分析器收集的信息的一小部分。详细数据在 cachegrind 文件中,可以通过各种工具进行可视化。有关示例,请参阅my answer on Profiling。虽然我不能 100% 确定你是否能够挖掘出比函数调用更多的东西 - 但它肯定应该通过可视化调用图来更容易地找到你的瓶颈。
-
(注意:如果您不想使用我的回答中提到的
profilestats包装器,但仍将配置文件结果写入文件,请直接使用Profileclass 而不是profile.run())