nor - Obtener "nombre global ''foo'' no está definido" con el tiempo de Python
timeit python (5)
Cambiar esta línea:
t = timeit.Timer("foo()")
A esto:
t = timeit.Timer("foo()", "from __main__ import foo")
Consulte el enlace que proporcionó en la parte inferior.
Para darle acceso al módulo timeit a las funciones que defina, puede pasar un parámetro de configuración que contenga una declaración de importación:
Acabo de probarlo en mi máquina y funcionó con los cambios.
Estoy tratando de averiguar cuánto tiempo lleva ejecutar una declaración de Python, así que busqué en línea y encontré que la biblioteca estándar proporciona un módulo llamado timeit que pretende hacer exactamente eso:
import timeit
def foo():
# ... contains code I want to time ...
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs/n" % (time,)
dotime()
Sin embargo, esto produce un error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in dotime
File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
NameError: global name ''foo'' is not defined
Todavía soy nuevo en Python y no entiendo completamente todos los problemas de alcance que tiene, pero no sé por qué este fragmento no funciona. ¿Alguna idea?
Puedes probar este truco:
import timeit
def foo():
print ''bar''
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs/n" % (time,)
import __builtin__
__builtin__.__dict__.update(locals())
dotime()
Puedes usar globals=globals()
t = timeit.Timer("foo()", globals=globals())
De la documentation :
Otra opción es pasar
globals()al parámetroglobals, que hará que el código se ejecute dentro de su espacio de nombres global actual. Esto puede ser más conveniente que especificar individualmente las importaciones
agregar a su configuración "importar este archivo";
luego cuando llamas a la función de configuración myfunc () usas "thisfile.myfunc ()"
por ejemplo, "thisfile.py"
def myfunc():
return 5
def testable(par):
pass
t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)
print( t )
t = timeit.Timer("foo()", "from __main__ import foo")
Dado que Timeit no tiene tus cosas en el alcance.