Получение "глобального имени" foo 'не определено "с помощью Python timeit
Я пытаюсь выяснить, сколько времени требуется для выполнения инструкции Python, поэтому я посмотрел онлайн и обнаружил, что стандартная библиотека предоставляет модуль под названием timeit, который предназначен для выполнения именно этого:
import timeit
def foo():
# ... contains code I want to time ...
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs\n" % (time,)
dotime()
Однако это вызывает ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in dotime
File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
NameError: global name 'foo' is not defined
Я все еще новичок в Python, и я не совсем понимаю все проблемы, которые он имеет, но я не знаю, почему этот фрагмент не работает. Любые мысли?
Ответы
Ответ 1
Измените эту строку:
t = timeit.Timer("foo()")
Для этого:
t = timeit.Timer("foo()", "from __main__ import foo")
Проверьте ссылку, которую вы указали в самом низу.
Чтобы предоставить модулю timeit доступ к определенным вами функциям, вы можете передать параметр настройки, который содержит оператор импорта:
Я только что протестировал его на своей машине и работал с изменениями.
Ответ 2
Вы можете попробовать этот взлом:
import timeit
def foo():
print 'bar'
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs\n" % (time,)
import __builtin__
__builtin__.__dict__.update(locals())
dotime()
Ответ 3
t = timeit.Timer("foo()", "from __main__ import foo")
Поскольку timeit не имеет ваших данных в области видимости.
Ответ 4
Вы можете использовать globals=globals()
t = timeit.Timer("foo()", globals=globals())
Из документация:
Другой вариант - передать globals()
в параметр globals
, который приведет к тому, что код будет выполнен в рамках текущего глобального Пространство имен. Это может быть более удобным, чем индивидуальное указание импорт
Ответ 5
добавить в свою настройку "import thisfile";
тогда, когда вы вызываете функцию настройки myfunc(), используйте "thisfile.myfunc()"
например, "thisfile.py"
def myfunc():
return 5
def testable(par):
pass
t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)
print( t )