获取Python中的执行时间函数

2 投票
4 回答
1988 浏览
提问于 2025-04-17 08:00

我写了一个可以获取另一个函数运行时间的功能:

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

撰写回答