Python配置文件陷阱

时间:2011-07-10 00:05:10

标签: python profile benchmarking

我是一个刚刚开始描述我的代码的初学者,并且很困惑为什么cProfile给出的经过的时间与使用time.time()给出的时间差不多。

# Python 2.7.2

import cProfile

def f(n):
    G = (i for i in xrange(n))
    sum = 0
    for i in G:
        sum += i

num = 10**6

cProfile.run('f(num)')

这给了     在2.648秒内进行1000004次函数调用

然而有了time.time(),我得到0.218000173569秒

import time

x = time.time()
f(num)
print time.time() - x

据我所读,我想这可能是因为cProfile的开销。有关cProfile时序可能非常关闭的常规提示,还是获得更准确计时的方法?

2 个答案:

答案 0 :(得分:3)

分析的目的是找出你的程序的哪些部分花费最多的时间,因此需要最多的关注。如果一个功能正在使用90%的时间,那么您应该在那里查看如何使该功能更有效。整个运行是否需要10秒或1000次并不重要。

也许分析器给你的最重要的信息是调用一些东西。为什么这是有用的是它可以帮助您找到不必要地经常调用事物的地方,特别是如果您有嵌套循环,或许多调用其他函数的函数。分析器可以帮助您跟踪这些内容。

分析开销是不可避免的,而且很大。但让分析器完成它所做的事情要比在整个地方插入你自己的时间和打印语句容易得多。

答案 1 :(得分:1)

请注意,cProfile会为您提供CPU time,但使用time.time()会为您提供已用时间(这不是您想要的)。

也许您可以尝试使用unix time程序。

➜  sandbox  /usr/bin/time -p python profiler.py

real         0.17
user         0.14
sys          0.01

CPU时间应为user + sys