Получение "глобального имени 'foo' не определено" с помощью Python timeit - PullRequest
81 голосов
/ 16 февраля 2009

Я пытаюсь выяснить, сколько времени требуется для выполнения инструкции Python, поэтому я посмотрел онлайн и обнаружил, что стандартная библиотека предоставляет модуль с именем timeit , который подразумевает именно это: 1003 *

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 и не до конца понимаю все проблемы с областями видимости, но я не знаю, почему этот фрагмент не работает. Есть мысли?

Ответы [ 5 ]

88 голосов
/ 16 февраля 2009

Изменить эту строку:

t = timeit.Timer("foo()")

К этому:

t = timeit.Timer("foo()", "from __main__ import foo")

Проверьте ссылку, которую вы предоставили в самом низу.

Чтобы предоставить модулю timeit доступ к определенным вами функциям, вы можете передать параметр настройки, содержащий оператор импорта:

Я только что проверил его на своей машине, и он работал с изменениями.

20 голосов
/ 22 марта 2011

Вы можете попробовать этот хак:

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()
16 голосов
/ 05 сентября 2017

С Python 3 вы можете использовать globals=globals()

t = timeit.Timer("foo()", globals=globals())

Из документации :

Другой вариант - передать globals() параметру globals, который приведет к выполнению кода в вашей текущей глобальной Пространство имен. Это может быть удобнее, чем индивидуальное указание импорт

8 голосов
/ 16 февраля 2009
t = timeit.Timer("foo()", "from __main__ import foo")

Поскольку у времени нет ваших вещей в поле зрения.

0 голосов
/ 02 июня 2017

добавьте в ваши настройки "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 )
...