Я столкнулся с каким-то странным поведением, пытаясь рассчитать время 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 работает нормально а второй нет. Выполнение foobar.py с использованием exe c без оболочки timeit также работает нормально.
У кого-нибудь есть объяснение этому странному поведению?