2012-01-04 19 views
6

Ho un problema con la funzione di tempo per l'ottimizzazione del codice. Ad esempio, scrivendo funzioni con parametri in un file, chiamiamolo myfunctions.py contenente:Python Timeit e "nome globale ... non definito"

def func1(X): 
    Y = X+1 
    return Y 

e provo questa funzione in un secondo file test.py dove chiamo il timer per testare le prestazioni del codice (in ovviamente più complessa problemi) che contengono:!

import myfunctions 
X0 = 1 
t = Timer("Y0 = myfunctions.func1(X0)") 
print Y0 
print t.timeit() 

il Y0 non viene calcolato, e anche se io commento print Y0 linea l'errore si è verificato. global name 'myfunctions' is not defined

Se specifico il setup con il comando

t = Timer("Y0 = myfunctions.func1(X0)","import myfunctions") 

ora l'errore si è verificato global name 'X0' is not defined.

Qualcuno sa come risolvere questo? Grazie molto.

+0

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

risposta

6

È necessario il parametro setup. Prova:

Timer("Y0 = myfunctions.func1(X0)", setup="import myfunctions; X0 = 1") 
+0

Come ho menzionato nella domanda, questo restituisce un errore "nome globale 'X0' non è definito" – cedm34

+0

@ cedm34 Vedere l'aggiornamento –

+1

L'errore globale è scomparso.Ma questo non crea il valore Y0. C'è una soluzione per? – cedm34

4

La ragione di Y0 essere undefined è che è stato definito che in una stringa, ma in fase di analisi all'inizio dell'esecuzione della stringa non è ancora valutato a portare la variabile in vita. Quindi metti uno Y0 = 0 da qualche parte nella parte superiore del tuo script per definirlo in anticipo.

Tutte le funzioni e le variabili esterne devono essere assegnate a Timer utilizzando l'argomento setup. Quindi hai bisogno di "import myfunctions; X0 = 1" come parametro di configurazione.

Ciò funzionerà:

from timeit import Timer 
import myfunctions 
X0 = 1 
Y0 = 0  #Have Y0 defined 
t = Timer("Y0 = myfunctions.func1(X0)", "import myfunctions; X0 = %i" % (X0,)) 
print t.timeit() 
print Y0 

Guardate come ho usato "X0 = %i" % (X0,) passare del valore reale della variabile X0 esterna.

Un'altra cosa che si potrebbe desiderare di sapere è che se ci sono le funzioni nel file principale che si desidera utilizzare in timeit, è possibile effettuare timeit riconoscerli passando from __main__ import * come secondo argomento.


Se vuoi timeit essere in grado di modificare le variabili, allora non dovrebbe passare le stringhe a loro. Più convenientemente puoi passare callables ad esso. Dovresti passare un callable che cambia la tua variabile desiderata. Non è necessario setup quindi. Guarda:

from timeit import Timer 
import myfunctions 

def measure_me(): 
    global Y0 #Make measure_me able to modify Y0 
    Y0 = myfunctions.func1(X0) 

X0 = 1 
Y0 = 0  #Have Y0 defined 
t = Timer(measure_me) 
print t.timeit() 
print Y0 

Come vedete, ho messo print Y0dopoprint t.timeit() dato esecuzione prima che non si può avere il suo valore cambiato!

Problemi correlati