Timeit, NameError: глобальное имя не определено. Но я не использовал глобальную переменную

Я хотел бы измерить скорость выполнения следующего кода:

def pe1():
    l = []
    for i in range(1000):
        if i%3 == 0 or i%5 == 0:
            l.append(i)
    print sum(l)

Я сохранил этот код в pe1m.py. Теперь я хотел бы протестировать скорость файла с интерпретатором python. Я сделал:

import timeit
import pe1m

t = timeit.Timer(stmt = 'pe1m.pe1()')
t.timeit()

но я получаю:

File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/timeit.py", line 195, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: global name 'pe1m' is not defined

Но у меня нет глобальных переменных.


person Bentley4    schedule 12.04.2012    source источник
comment
Когда вы импортируете модули, есть инструкция: import pe1m, которая, имхо, является опечаткой для какого-то другого модуля.   -  person hjpotter92    schedule 13.04.2012
comment
Возможный дубликат Получение глобального имени 'foo' не определено с Python timeit   -  person sds    schedule 20.09.2017


Ответы (2)


Попробуй это:

t = timeit.Timer(stmt='pe1()', setup='from pe1m import pe1')

timeit.Timer объект не знает о пространстве имен, в котором вы его вызываете, поэтому он не может получить доступ к pe1m модулю, который вы импортировали.

Аргумент setup - это оператор, выполняемый в контексте синхронизированного оператора, они используют одно и то же пространство имен, поэтому все, что вы там определите, будет доступно в stmt.

person yak    schedule 12.04.2012
comment
да. Вам нужен setup для импорта модуля в пространство имен времени - используете ли вы from или pe1m., это вопрос или предпочтение. - person agf; 13.04.2012
comment
Когда я делаю t = timeit.Timer(stmt='pe1()', setup='from pe1m import pe1'), то t.timeit() он просто продолжает бесконечно печатать вывод pe1m.pe1() (что составляет 233168). - person Bentley4; 14.04.2012
comment
@yak, если вы обновите свое решение (добавьте строку t.timeit(number=1)), я могу удалить свой ответ ниже. - person Jakob Kroeker; 20.07.2013

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

>>>def pe1():
>>>    l = []
>>>    for i in range(1000):
>>>        if i%3 == 0 or i%5 == 0:
>>>            l.append(i)
>>>    print(sum(l))
>>>
>>>from  timeit import time it
>>>timeit('pe1()',setup="from __main__ import pe1",number=100) # Run 100 times
>>>timeit('pe1()',setup="from __main__ import pe1")  # run default times of 1000000 
person Adebiyi Abdurrahman    schedule 17.02.2015