2012-04-12 10 views
7

vorrei misurare la velocità di esecuzione del seguente codice:Timeit, NameError: il nome globale non è definito. Ma non ho usato una variabile globale

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

ho memorizzato il codice sotto pe1m.py. Ora mi piacerebbe testare la velocità del file con l'interprete python. Ho fatto:

import timeit 
import pe1m 

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

ma ottengo:

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 

Ma non ho alcun variabili globali.

+0

Quando si importano i moduli, c'è una dichiarazione: pe1m di importazione che, secondo me, è un errore di battitura per qualche altro modulo. – hjpotter92

+0

Possibile duplicato di [Ottenere "nome globale" foo "non è definito" con Python's timeit] (https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons -timeit) – sds

risposta

13

Prova questa:

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

timeit.Timer oggetto non conosce lo spazio dei nomi si sta chiamando in modo che non possa accedere al modulo pe1m che importato.

L'argomento setup è un'istruzione eseguita nel contesto dell'istruzione temporizzata, essi condividono lo stesso spazio dei nomi in modo tale che qualsiasi cosa venga definita lì, sarà accessibile in stmt.

+0

Sì. È necessario un 'setup' per importare il modulo nello spazio dei nomi temporali, indipendentemente dal fatto che tu usi' from' o 'pe1m' sia una questione o una preferenza. – agf

+1

Quando eseguo 't = timeit.Timer (stmt = 'pe1()', setup = 'da pe1m import pe1')' then 't.timeit()' continua a stampare l'output di 'pe1m.pe1 () '(che è 233168) infinitamente. – Bentley4

+0

@yak se aggiorni la tua soluzione (aggiungi la riga 't.timeit (numero = 1)'), posso cancellare la mia risposta qui sotto. –

2

Si può anche provare questo

>>>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 
Problemi correlati