我想计时一些代码。首先,我使用了一个计时装饰器:
#!/usr/bin/env python
import time
from itertools import izip
from random import shuffle
def timing_val(func):
def wrapper(*arg, **kw):
'''source: http://www.daniweb.com/code/snippet368.html'''
t1 = time.time()
res = func(*arg, **kw)
t2 = time.time()
return (t2 - t1), res, func.__name__
return wrapper
@timing_val
def time_izip(alist, n):
i = iter(alist)
return [x for x in izip(*[i] * n)]
@timing_val
def time_indexing(alist, n):
return [alist[i:i + n] for i in range(0, len(alist), n)]
func_list = [locals()[key] for key in locals().keys()
if callable(locals()[key]) and key.startswith('time')]
shuffle(func_list) # Shuffle, just in case the order matters
alist = range(1000000)
times = []
for f in func_list:
times.append(f(alist, 31))
times.sort(key=lambda x: x[0])
for (time, result, func_name) in times:
print '%s took %0.3fms.' % (func_name, time * 1000.)
收益率
% test.py
time_indexing took 73.230ms.
time_izip took 122.057ms.
在这里我用时间:
% python - m timeit - s '' 'alist=range(1000000);[alist[i:i+31] for i in range(0, len(alist), 31)]'
10 loops, best of 3:
64 msec per loop
% python - m timeit - s 'from itertools import izip' 'alist=range(1000000);i=iter(alist);[x for x in izip(*[i]*31)]'
10 loops, best of 3:
66.5 msec per loop
使用timeit,结果实际上是相同的,但是使用timeing decorator,似乎time_indexing
比time_izip
快。
是什么造成了这种差异?
两种方法都可信吗?
如果是,是哪一个?
我将使用一个计时装饰器,因为您可以使用注释在代码周围散布计时,而不是让代码与计时逻辑混淆。
使用decorator很容易使用注释。
或者重新命名要计时的函数。
使用
functools
中的包装来改进Matt Alcock的答案。例如:
调用用
@timing
包装的方法f
:这样做的好处是它保留了原始函数的属性;也就是说,像函数名和docstring这样的元数据正确地保留在返回的函数上。
利用时间。不止一次地进行测试给了我更好的结果。
->
相关问题 更多 >
编程相关推荐