我创建了这个工作函数来获取另一个函数的时间:
def get_execution_time(function, args, numberOfExecTime=1):
"""Return the execution time of a function in seconds.
"""
return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5)
顺便提一下我有一个问题:我不能给要定时的函数多个输入(args)。 我怎样才能做到这一点?部分是正确的工具吗?
我尝试过装饰,但我无法存储我做统计数据所需的时间。
答案 0 :(得分:4)
如果你可以牺牲numberOfExecTime
参数的默认值,你就可以这样做:
from timeit import Timer
from functools import partial
def get_execution_time(function, numberOfExecTime, *args, **kwargs):
"""Return the execution time of a function in seconds."""
return round(Timer(partial(function, *args, **kwargs))
.timeit(numberOfExecTime), 5)
def foo(a, b, c = 12):
print a, b, c
get_execution_time(foo, 1, 3, 4, c = 14)
或者您可以这样做并且仍然具有numberOfExecTime
的默认值:
from timeit import Timer
from functools import partial
def get_execution_time(function, *args, **kwargs):
"""Return the execution time of a function in seconds."""
numberOfExecTime = kwargs.pop('numberOfExecTime', 1)
return round(Timer(partial(function, *args, **kwargs))
.timeit(numberOfExecTime), 5)
def foo(a, b, c = 1):
print a, b, c
get_execution_time(foo, 1, 2, c = 2)
# => 1 2 2
get_execution_time(foo, 4, 5, c = 3, numberOfExecTime = 2)
# => 4 5 3
# => 4 5 3
答案 1 :(得分:3)
你可以传递多个参数:args
应该是一个包含要传递的参数的元组。
现在,您可以传递*args
而不是args
。
(如果您还需要将kwargs传递给您的方法,那么请在get_execution_time
另一个参数kwargs
并将**kwargs
传递给您的function
def get_execution_time(function, args=(), kwargs ={}, numberOfExecTime=1):
return round(Timer(partial(function, *args, **kwargs)).timeit(numberOfExecTime), 5)
答案 2 :(得分:2)
我会使用时间装饰器。
import time
def timeit(f):
def timed(*args, **kw):
ts = time.time()
result = f(*args, **kw)
te = time.time()
print 'func:%r args:[%r, %r] took: %2.4f sec' % \
(f.__name__, args, kw, te-ts)
return result
return timed
使用装饰器很容易使用注释。
@timeit
def compute_magic(n):
#function definition
#....
或者重新设置您想要的时间功能。
compute_magic = timeit(compute_magic)
我的博文在这里有更多信息。 http://blog.mattalcock.com/2013/2/24/timing-python-code/
答案 3 :(得分:0)
如果args
是list
个参数,您可以使用*args
展开它:
return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5)