【发布时间】:2020-06-24 10:32:03
【问题描述】:
我在尝试对 python 脚本计时时遇到了一些奇怪的行为。最小示例:
foobar.py:
foo = 'Hello'
print(''.join(c for c in foo if c not in 'World'))
print(''.join(c for c in 'World' if c not in foo))
timer.py:
import timeit
timeit.repeat(stmt="exec(open('foobar.py').read())", repeat=1, number=1)
当我运行 foobar.py 时,我得到了预期的输出:
> python3 foobar.py
He
Wrd
但是,当我运行 timer.py 时,我收到以下错误:
> python3 timer.py
He
Traceback (most recent call last):
File "timer.py", line 2, in <module>
timeit.repeat(stmt="exec(open('foobar.py').read())", repeat=1, number=1)
File "/usr/lib/python3.7/timeit.py", line 237, in repeat
return Timer(stmt, setup, timer, globals).repeat(repeat, number)
File "/usr/lib/python3.7/timeit.py", line 204, in repeat
t = self.timeit(number)
File "/usr/lib/python3.7/timeit.py", line 176, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
File "<string>", line 3, in <module>
File "<string>", line 3, in <genexpr>
NameError: name 'foo' is not defined
也许最奇怪的是 foobar.py 中的第一个打印语句可以正常工作,而第二个则不能。使用没有 timeit 包装器的 exec 执行 foobar.py 也可以正常工作。
有人对这种奇怪的行为有解释吗?
【问题讨论】:
标签: python python-3.7 timeit