3

有没有办法为 python 中的 timeit.timeit() 函数指定拆解?我知道“声明”和“设置”存在争议,但我还没有找到执行拆卸的好方法。

在我的“状态”中包含拆解代码会扭曲我尝试计时的代码片段的时间。我需要拆解以释放硬件资源,以便我可以使用 timeit 模块中的重复功能。

4

1 回答 1

1

不,没有真正好的方法可以做到这一点。查看源代码,您可能需要对 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从上面复制 my 。如果你想尽可能干净地做到这一点,也许使用来打补丁/取消打补丁是个好主意(尽管你也可以自己做,没有太多麻烦)。mock

请注意,我们在这里玩过内部的东西——这个答案可能会在没有警告的情况下随时中断,并且它可能只适用于 CPython,因为这些都没有记录。

于 2014-03-25T15:49:28.313 回答