Python中函数的准确计时
我在Windows上用Python编程,想准确测量一个函数运行的时间。我写了一个叫“time_it”的函数,它接收另一个函数,运行它,然后返回运行所花的时间。
def time_it(f, *args):
start = time.clock()
f(*args)
return (time.clock() - start)*1000
我调用这个函数1000次,然后计算平均值。(最后的1000是为了把结果转换成毫秒。)
这个函数看起来是有效的,但我总觉得我可能做错了什么,感觉这样做可能会比实际运行函数所需的时间更长。
有没有更标准或更被接受的方法来做这个呢?
当我把测试函数改成调用一个打印语句,让它运行得更久时,我的time_it函数返回的平均时间是2.5毫秒,而cProfile.run('f()')返回的平均时间是7.0毫秒。我原以为我的函数会高估时间,怎么会出现这种情况呢?
还有一点需要说明的是,我关心的是函数之间的相对时间,而不是绝对时间,因为这显然会因硬件和其他因素而有所不同。
7 个回答
37
你可以这样创建一个叫做“timeme”的装饰器:
import time
def timeme(method):
def wrapper(*args, **kw):
startTime = int(round(time.time() * 1000))
result = method(*args, **kw)
endTime = int(round(time.time() * 1000))
print(endTime - startTime,'ms')
return result
return wrapper
@timeme
def func1(a,b,c = 'c',sleep = 1):
time.sleep(sleep)
print(a,b,c)
func1('a','b','c',0)
func1('a','b','c',0.5)
func1('a','b','c',0.6)
func1('a','b','c',1)
71
使用Python标准库中的 timeit
模块。
基本用法:
from timeit import Timer
# first argument is the code to be run, the second "setup" argument is only run once,
# and it not included in the execution time.
t = Timer("""x.index(123)""", setup="""x = range(1000)""")
print t.timeit() # prints float, for example 5.8254
# ..or..
print t.timeit(1000) # repeat 1000 times instead of the default 1million
39
与其自己写性能分析的代码,不如看看Python自带的性能分析工具(根据你的需求可以选择profile
或cProfile
)。你可以在这里找到相关信息:http://docs.python.org/library/profile.html