如果你传递timeit
一个函数而不是字符串,你可以完全避免这个问题。在这种情况下,函数在其正常的全局和闭包环境中执行。所以:
timeit.timeit(lambda: function(x))
或者,如果您愿意:
timeit.timeit(partial(function, x))
(详见这里。注意它需要 Python 2.6+,所以如果你需要 2.3-2.5,你不能使用这个技巧。)
正如文档所说,“请注意,在这种情况下,由于额外的函数调用,时间开销会稍大一些。”
这意味着它会使timeit
自己运行得更慢。例如:
>>> def f(): pass
>>> timeit.timeit('timeit.timeit("f()", setup="from __main__ import f")', setup='import timeit', number=1000)
91.66315175301861
>>> timeit.timeit(lambda: timeit.timeit(f), number=100)
94.89793294097762
但是,它不影响实际结果:
>>> timeit.timeit(f, number=100000000)
8.81197881908156
>>> timeit.timeit('f()', setup='from __main__ import f', number=100000000)
8.893913001054898
(在极少数情况下,这通常意味着一个或另一个版本没有按照在您的真实代码中调用它的方式测试函数,或者正在测试错误的闭包或类似情况。)
请注意,这里函数内部实际花费的时间约为 88 秒,因此我们几乎将计时代码的开销增加了一倍……但它仍然只增加了总测试时间的 3%。而且越不重要f
,这种差异就会越小。