Получение "глобального имени" 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 )