2

我创建了这个工作函数来获取另一个函数的时间:

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)。我怎样才能做到这一点?partial 是正确的工具吗?

我尝试了装饰器,但我无法存储做一些统计数据所需的时间。

4

4 回答 4

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
于 2011-12-08T20:39:33.137 回答
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)
于 2011-12-08T20:36:24.293 回答
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/

于 2013-02-28T13:04:48.960 回答
0

如果args是一个list参数,您可以使用以下方法扩展它*args

return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5)
于 2011-12-08T20:37:53.027 回答