2011-12-08 140 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/