Глобальное имя x не определено с помощью timeit

У меня есть простая функция Фибоначчи, которая использует запоминание и отлично работает сама по себе. Однако, когда я хочу отсчитать время с помощью timeit, я получаю «NameError: глобальное имя 'memo' не определено», хотя это так.

#!/usr/bin/python

import sys
import timeit

memo = [0] * 100

def fibmem(n,memo):
    #function things

for x in range(1,40):

    mytime2 = timeit.Timer('fibmem('+str(x)+', memo)','from __main__ import fibmem')
    delta2 = mytime2.timeit(1)
    print str(x) + ' ' +str(delta2)
    memo[:] = []

Я попытался найти, что это может быть, но большинство ответов включает в себя from __main__ import, и это не проблема. Я уверен, что это все еще как-то связано с определением объема работ, но я новичок в timeit, поэтому понятия не имею.


person imgoingmad    schedule 24.01.2016    source источник
comment
Возможный дубликат Получение глобального имени 'foo' не определено с Python timeit   -  person sds    schedule 20.09.2017


Ответы (1)


Добавьте memo в список переменных, импортированных из __main__:

mytime2 = timeit.Timer('fibmem({}, memo)'.format(x),'from __main__ import fibmem, memo')
person unutbu    schedule 24.01.2016
comment
Да, это сработало. Спасибо! - person imgoingmad; 24.01.2016
comment
Класс timeit.Timer в Python 3.5 имеет необязательный аргумент ключевого слова с именем globals, который также можно использовать для решения проблемы, хотя этот способ работает как в Python 2, так и в 3. - person martineau; 17.02.2016