python中的timeit模块无法识别numpy模块

时间:2014-01-19 11:35:58

标签: python numpy timeit

我想测试两个相同列表之间的处理时间,特别是普通列表和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'。

我应该如何编码以获得处理时间?

3 个答案:

答案 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')