2014-03-25 34 views
3

是否有指定的蟒蛇timeit.timeit()函數拆解的方法嗎? 我知道有'陳述'和'安裝'的論據,但我還沒有找到一個很好的方法來執行拆解。拆解爲蟒蛇timeit.timeit()函數

在我的'Statment'中包含拆解代碼會歪曲我正在嘗試計時的代碼片段的計時。我需要拆卸才能釋放硬件資源,以便我可以使用timeit模塊中的重複功能。

+0

不確定你的上下文是什麼,但請記住'安裝程序'只執行一次,而不是每個重複一次... –

回答

1

不,真的沒有這樣做的方法。查看source,您可能需要將Timer類繼承爲一個新版本,替換它們的self.inner

例如爲:

import inspect 
import timeit 

class MyTimer(timeit.Timer): 
    def __init__(self, stmt="pass", setup="pass", teardown=None, timer=timeit.default_timer): 
     timeit.Timer.__init__(self, stmt, setup, timer) 
     # Pull the actual function to time off the original `self.inner` function. 
     time_func = inspect.getargspec(self.inner).defaults[0] 
     # It gets added as a keyword so that lookup in the 
     # current namespace is really fast. 
     def _func(_it, _timer, _func=time_func): 
      setup() 
      total = 0.0 
      for _i in _it: 
       _t0 = _timer() 
       _func() 
       _t1 = timer() 
       total += _t1 - _t0 
       if teardown: 
        teardown() 
      return total 
     self.inner = _func 

要小心的是,既然你只限於在同一時間定時一個測試,你不會得到好定時的這種方式。不幸的是,我沒有足夠的聰明能夠找到一種方法來同時進行多個測試,並且需要調用,每個測試都需要

另外,你可以猴子補丁_template_func,基本上只是複製我的_func以上你創建你的計時器。如果你想盡可能幹淨地做到這一點,也許使用mock做補丁/不補丁是一個好主意(雖然你也可以自己做,沒有太大的麻煩)。

請注意,我們在這裏玩過內部的東西 - 這個答案可能在任何時候沒有任何警告就中斷,而且它可能只適用於CPython,因爲這些都沒有記錄。