Pregunta Obtener "nombre global 'foo' no está definido" con el tiempo de Python


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 cronométralo 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?


76
2018-02-15 23:15


origen


Respuestas:


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.


83
2018-02-15 23:18



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

19
2018-03-22 11:16



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

Dado que Timeit no tiene tus cosas en el alcance.


8
2018-02-15 23:22



Puedes usar globals=globals() 

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

Desde el documentación:

Otra opción es pasar globals() al globals parámetro, que   hará que el código se ejecute dentro de su actual global   espacio de nombres Esto puede ser más conveniente que especificar individualmente   importaciones


7
2017-09-05 12:51



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 )

0
2018-06-01 22:45