2011-12-08 97 views
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) 

顺便说我有一个问题:我不能给多输入(参数)的功能定时。 我该怎么做?部分是正确的工具?

我尝试装饰,但我不能存储的时间,这是我需要做一些统计。

回答

3

您可以传递多个参数:args应该是包含要传递的参数的元组。您可以通过*args而不是args

(如果您还需要kwargs传递给你的方法,然后在get_execution_time另一种说法kwargs,并通过**kwargsfunction

def get_execution_time(function, args=(), kwargs ={}, numberOfExecTime=1): 
    return round(Timer(partial(function, *args, **kwargs)).timeit(numberOfExecTime), 5) 
+0

这是使用现有代码的最佳答案。但是,如果您希望更多地控制您收到的数据,@ KL-7具有更强大的表现力。 – Edwin

+0

我犹豫要发布与KL-7所提议的相同的提案(除了我发布的提案之外),但在我眼中,我最终决定发布的版本是最好的版本,因为此函数的调用更直接,因为没有将哪个传递的参数传递给函数以及哪个是方法本身的参数的歧义... – gecco

+0

这就是为什么我说它具有*更具表现力*。我从来没有说过哪个答案是最好的,因为它取决于提问者想要的东西。 – Edwin

0

如果args是参数的list你可以用*args展开:

return round(Timer(partial(function, args)).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 
+0

你甚至不必牺牲默认值。只要在参数列表中省略它,并在kwargs else 1'中将'numberOfExecTime'作为第一行添加'numberOfExecTime = kwargs ['numberOfExecTime']。 – Wilduck

+0

我认为这几乎是我在第二个变体中使用默认值'pop'方法做的。 –

+0

哎呀,说实话,我甚至没有读到那么远:P。 – Wilduck

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/