获取Python中的执行时间函数
我写了一个可以获取另一个函数运行时间的功能:
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)
顺便说一下,我遇到了一个问题:我无法给需要计时的函数传递多个输入(参数)。我该怎么做呢?使用部分应用(partial)合适吗?
我试过使用装饰器,但我无法保存时间,这对我做一些统计分析是必要的。
4 个回答
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
你可以传递多个参数:args
应该是一个包含要传递参数的元组。
现在,你可以用 *args
来代替 args
。
(如果你还需要传递其他关键字参数给你的方法,那么在 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)
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