假设我有一些函数接受一个数组并将每个元素更改为0.
def function(array):
for i in range(0,len(array)):
array[i] = 0
return array
Run Code Online (Sandbox Code Playgroud)
我想测试这个函数在随机数组上运行需要多长时间,我希望生成timeit测试的OUTSIDE.换句话说,我不希望将生成数组所花费的时间包括在内.
我首先在变量x中存储一个随机数组并执行:
timeit.timeit("function(x)",setup="from __main__ import function")
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:NameError:未定义全局名称'x'
我怎样才能做到这一点?
Mar*_*ers 20
导入x从__main__ 还有:
timeit.timeit("function(x)", setup="from __main__ import function, x")
Run Code Online (Sandbox Code Playgroud)
就像function,x是__main__模块中的名称,可以导入到timeit设置中.
aba*_*ert 11
如果传递timeit函数而不是字符串,则可以完全避免此问题.在这种情况下,函数在其正常的全局和闭包环境中执行.所以:
timeit.timeit(lambda: function(x))
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意:
timeit.timeit(partial(function, x))
Run Code Online (Sandbox Code Playgroud)
(有关详细信息,请参阅此处.请注意,它需要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
Run Code Online (Sandbox Code Playgroud)
但是,它不会影响实际结果:
>>> timeit.timeit(f, number=100000000)
8.81197881908156
>>> timeit.timeit('f()', setup='from __main__ import f', number=100000000)
8.893913001054898
Run Code Online (Sandbox Code Playgroud)
(在极少数情况下,这通常意味着一个版本或另一个版本没有像在实际代码中调用函数那样测试函数,或者测试错误的闭包或类似函数.)
请注意,此处函数内部的实际时间约为88秒,因此我们几乎将时序代码的开销增加了一倍......但它仍然只增加了3%的总测试时间.而不那么微不足道的f是,差异越小.
| 归档时间: |
|
| 查看次数: |
6397 次 |
| 最近记录: |