我想测试两个相同列表之间的处理时间,特别是普通列表和numpy列表。我的代码是
import timeit
import numpy as np
t = timeit.Timer("range(1000)")
print t.timeit()
u = timeit.Timer("np.arange(1000)")
print u.timeit()
t
的计算很好,但对于u
NameError:列出了未定义的全局名称'np'。
我应该如何编码以获得处理时间?
答案 0 :(得分:12)
timeit.Timer
类可以两种不同的方式使用。
它可以将源代码编译为执行 - 在这种情况下,代码在只运行setup
代码的新环境中执行,或者它可以采用可调用的,在这种情况下只调用callable(在当前环境中,就像任何其他可调用的一样)。
所以,你有两个选择:
u = timeit.Timer("np.arange(1000)", setup='import numpy as np')
......或......
u = timeit.Timer(lambda: np.arange(1000))
在第一种情况下,您碰巧完成import numpy as np
这一事实无关紧要;它对编译和执行np.arange(1000)
的环境没有影响(因此你必须将它包含在setup=...
位中)。
在第二种情况下,您完成了import numpy as np
显然 相关的事实 - 它会影响您的代码(包括lambda: np.arange(1000)
)获取的环境评价。
答案 1 :(得分:4)
要将导入的库与timeit
一起使用,您必须使用setup
关键字参数(docs)导入它们:
import timeit
# Doesn't require setup kwarg as range doesn't need to be imported.
t = timeit.Timer("range(1000)")
print t.timeit()
# Requires the import of numpy (as np) through the setup kwarg.
u = timeit.Timer("np.arange(1000)", setup = 'import numpy as np')
print(u.timeit())
setup
关键字参数允许您设置代码,例如导入外部库或通过使用from __main__ import func
从代码中导入函数。
答案 2 :(得分:2)
使用setup
参数:
u = timeit.Timer("np.arange(1000)", setup='import numpy as np')