2012-04-12 16 views
7

me gustaría para medir la velocidad de ejecución del código siguiente:Timeit, NameError: el nombre global no está definido. Pero yo no usar una variable global

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

que almacena este código bajo pe1m.py. Ahora me gustaría probar la velocidad del archivo con el intérprete de Python. Lo hice:

import timeit 
import pe1m 

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

pero me sale:

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 

Pero no tengo ninguna variable global.

+0

Al importar los módulos, hay una declaración: pe1m de importación que, en mi humilde opinión, es un error de algún otro módulo. – hjpotter92

+0

Posible duplicado de [Obtener "nombre global 'foo' no está definido" con el tiempo de Python] (https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons -timeit) – sds

Respuesta

13

Prueba esto:

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

timeit.Timer objeto no sabe sobre el espacio de nombres que está llamando en lo que no se puede acceder al módulo pe1m que ha importado.

El argumento setup es una instrucción ejecutada en el contexto de la instrucción cronometrada, comparten el mismo espacio de nombres, así que cualquiera que defina allí, será accesible en stmt.

+0

Sí. Necesita una 'configuración' para importar el módulo en el espacio de nombres de la hora, ya sea que use' from' o 'pe1m'. Es una cuestión o preferencia. – agf

+1

Cuando hago 't = timeit.Timer (stmt = 'pe1()', setup = 'desde pe1m import pe1')' luego 't.timeit()' solo sigue imprimiendo la salida de 'pe1m.pe1 () '(que es 233168) infinitamente. – Bentley4

+0

@yak si actualiza su solución (agregue la línea 't.timeit (number = 1)'), puedo eliminar mi respuesta a continuación. –

2

También puede probar este

>>>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 
Cuestiones relacionadas