Getting “global name 'foo' is not defined” with Python's timeit

眉间皱痕 提交于 2019-11-26 09:19:00

问题


I\'m trying to find out how much time it takes to execute a Python statement, so I looked online and found that the standard library provides a module called timeit that purports to do exactly that:

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

However, this produces an 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

I\'m still new to Python and I don\'t fully understand all the scoping issues it has, but I don\'t know why this snippet doesn\'t work. Any thoughts?


回答1:


Change this line:

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

To this:

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

Check out the link you provided at the very bottom.

To give the timeit module access to functions you define, you can pass a setup parameter which contains an import statement:

I just tested it on my machine and it worked with the changes.




回答2:


You can try this 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()



回答3:


With Python 3, you can use globals=globals()

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

From the documentation:

Another option is to pass globals() to the globals parameter, which will cause the code to be executed within your current global namespace. This can be more convenient than individually specifying imports




回答4:


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

Since timeit doesn't have your stuff in scope.




回答5:


add into your setup "import thisfile; "

then when you call the setup function myfunc() use "thisfile.myfunc()"

eg "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 )


来源:https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons-timeit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!