2012-04-12 4 views
7

Ich mag die Ausführungsgeschwindigkeit des folgenden Codes messen:Timeit, NameError: globaler Name ist nicht definiert. Aber ich habe nicht mit einer globalen Variablen

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

ich diesen Code unter pe1m.py gespeichert. Jetzt möchte ich die Geschwindigkeit der Datei mit dem Python-Interpreter testen. Ich tat:

import timeit 
import pe1m 

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

aber ich bekomme:

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 

Aber ich habe keine globalen Variablen.

+0

Wenn Sie die Module importieren, gibt es eine Erklärung: import pe1m, die imho, ein Tippfehler für ein anderes Modul ist. – hjpotter92

+0

Mögliches Duplikat von [Getting "global name 'foo' ist nicht definiert" mit Python's timeit] (https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons -timeit) – sds

Antwort

13

Versuchen Sie folgendes:

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

timeit.Timer Objekt nicht weiß, über den Namespace sind Sie es in so nennen es die pe1m Modul nicht zugreifen können, die Sie importiert.

Das setup Argument ist eine Anweisung, die im Kontext der zeitgesteuerten Anweisung ausgeführt wird. Sie teilen sich den gleichen Namespace, so dass alles, was Sie dort definieren, in stmt zugänglich ist.

+0

Ja. Sie benötigen ein 'setup', um das Modul in den time namespace zu importieren - ob Sie' from' oder 'pe1m' verwenden, ist eine Frage oder eine Vorliebe. – agf

+1

Wenn ich 't = timeit.Timer (stmt =' pe1() ', setup =' von pe1m import pe1 ') then dann 't.timeit()' es nur weiter die Ausgabe von 'pe1m.pe1 () '(was 233168 ist) unendlich. – Bentley4

+0

@yak Wenn Sie Ihre Lösung aktualisieren (fügen Sie die Zeile 't.timeit (number = 1)' hinzu), kann ich meine Antwort unten löschen. –

2

Sie auch diese versuchen können

>>>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 
Verwandte Themen