Obtener “nombre global ‘foo’ no está definido” con el tiempo de Python

Estoy intentando averiguar cuánto tiempo lleva ejecutar una statement de Python, así que busqué en línea y descubrí 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 "", line 1, in  File "", line 3, in dotime File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit timing = self.inner(it, self.timer) File "", 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 scope que tiene, pero no sé por qué este fragmento de código no funciona. ¿Alguna idea?

Cambia esta línea:

 t = timeit.Timer("foo()") 

A esto:

 t = timeit.Timer("foo()", "from __main__ import foo") 

Echa un vistazo al enlace que proporcionaste en la parte inferior.

Para otorgarle al módulo timeit acceso a las funciones que defina, puede pasar un parámetro de configuración que contiene una statement de importación:

Acabo de probarlo en mi máquina y funcionó con los cambios.

Puedes probar este hack:

 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() 

Con Python 3, puedes usar globals=globals()

 t = timeit.Timer("foo()", globals=globals()) 

De la documentación :

Otra opción es pasar globals() al parámetro globals , lo 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.

 t = timeit.Timer("foo()", "from __main__ import foo") 

Ya que el tiempo no tiene tus cosas en el scope.

agregue en su configuración “importar este archivo;”

luego, cuando llame a la función de configuración myfunc () use “thisfile.myfunc ()”

por ejemplo, “este archivo.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 )