2016-01-24 65 views
0

我有一個簡單的使用memoisation的斐波那契函數,它的工作原理很好。但是,當我想使用timeit計時時,我得到「NameError:全局名稱」備忘錄「未定義」,即使它是。全球名稱「x」沒有使用timeit定義

#!/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很陌生,所以我不知道。

+0

的可能的複製[入門「全局名稱‘富’是沒有定義」與Python的timeit(https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons-timeit) – sds

回答

5

添加memo到的變量從__main__進口名單:

mytime2 = timeit.Timer('fibmem({}, memo)'.format(x),'from __main__ import fibmem, memo') 
+0

是的,這是做到了。謝謝! – imgoingmad

+1

Python 3.5中的['timeit.Timer'](https://docs.python.org/3/library/timeit.html#timeit.timeit)類具有一個名爲'globals'的可選關鍵字參數,它也可以用於解決這個問題 - 儘管這種方式在Python 2和Python 3中均可用。 – martineau