2012-04-12 127 views
7

我想測量以下代碼的執行速度: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 

但我沒有任何全局變量。

+0

當您導入模塊,有一種說法:進口pe1m其中,恕我直言,是其他模塊一個錯字。 – hjpotter92 2012-04-12 22:15:45

+0

[使用Python的timeit獲取「全局名稱'foo'未定義的可能的副本](https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons -timeit) – sds 2017-09-20 16:21:48

回答

13

試試這個:

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

timeit.Timer對象不知道你調用它,因此它不能訪問您導入的pe1m模塊的命名空間。

setup參數是在定時語句的上下文中執行的語句,它們共享相同的名稱空間,因此無論您在那裏定義什麼,都可以在stmt中訪問。

+0

是的。你需要一個'setup'將模塊導入到時間命名空間中 - 無論你使用'from'還是'pe1m.'都是一個問題或偏好。 – agf 2012-04-12 22:39:00

+1

當我做't = timeit.Timer(stmt ='pe1()',設置='從pe1m導入pe1')'然後't.timeit()'它只是繼續打印'pe1m.pe1 )'(這是233168)無限。 – Bentley4 2012-04-14 16:32:34

+0

@yak如果你更新你的解決方案(添加't.timeit(number = 1)'行),我可以在下面刪除我的答案。 – 2013-07-19 23:09:54

2

你也可以試試這個

>>>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 
相關問題