Timeit,NameError:未定义全局名称。但我没有使用全局变量
我想测量以下代码的执行速度:Timeit,NameError:未定义全局名称。但我没有使用全局变量
def pe1():
l = []
for i in range(1000):
if i%3 == 0 or i%5 == 0:
l.append(i)
print sum(l)
我存储在pe1m.py此代码。 现在我想用python解释器测试文件的速度。我所做的:
import timeit
import pe1m
t = timeit.Timer(stmt = 'pe1m.pe1()')
t.timeit()
,但我得到:
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/timeit.py", line 195, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
NameError: global name 'pe1m' is not defined
但我没有任何全局变量。
试试这个:
t = timeit.Timer(stmt='pe1()', setup='from pe1m import pe1')
timeit.Timer
对象不知道你调用它,因此它不能访问您导入的pe1m
模块的命名空间。
setup
参数是在定时语句的上下文中执行的语句,它们共享相同的名称空间,因此无论您在那里定义什么,都可以在stmt
中访问。
是的。你需要一个'setup'将模块导入到时间命名空间中 - 无论你使用'from'还是'pe1m.'都是一个问题或偏好。 – agf 2012-04-12 22:39:00
当我做't = timeit.Timer(stmt ='pe1()',设置='从pe1m导入pe1')'然后't.timeit()'它只是继续打印'pe1m.pe1 )'(这是233168)无限。 – Bentley4 2012-04-14 16:32:34
@yak如果你更新你的解决方案(添加't.timeit(number = 1)'行),我可以在下面删除我的答案。 – 2013-07-19 23:09:54
你也可以试试这个
>>>def pe1():
>>> l = []
>>> for i in range(1000):
>>> if i%3 == 0 or i%5 == 0:
>>> l.append(i)
>>> print(sum(l))
>>>
>>>from timeit import time it
>>>timeit('pe1()',setup="from __main__ import pe1",number=100) # Run 100 times
>>>timeit('pe1()',setup="from __main__ import pe1") # run default times of 1000000
当您导入模块,有一种说法:进口pe1m其中,恕我直言,是其他模块一个错字。 – hjpotter92 2012-04-12 22:15:45
[使用Python的timeit获取“全局名称'foo'未定义的可能的副本](https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons -timeit) – sds 2017-09-20 16:21:48