获取“全球名称”foo“没有被定义”与Python的时间
我试图找出需要多less时间来执行一条Python语句,所以我在网上查找,发现标准库提供了一个名为timeit的模块,声称可以做到这一点:
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()
但是,这会产生一个错误:
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
我还是一个Python的新手,我不完全理解它所有的范围问题,但是我不知道为什么这个代码不起作用。 有什么想法吗?
改变这一行:
t = timeit.Timer("foo()")
对此:
t = timeit.Timer("foo()", "from __main__ import foo")
看看你在底部提供的链接。
要让timeit模块访问您定义的函数,您可以传递一个包含导入语句的设置参数:
我只是在我的机器上进行了testing,并且与更改一起工作。
你可以试试这个黑客:
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()
t = timeit.Timer("foo()", "from __main__ import foo")
由于时间没有你的东西在范围内。
你可以使用globals=globals()
t = timeit.Timer("foo()", globals=globals())
从文档 :
另一个select是将
globals()
传递给globals
参数,这将导致代码在当前的全局名称空间内执行。 这比单独指定导入更方便
添加到您的设置“导入此文件;”
那么当你调用设置函数myfunc()时使用“thisfile.myfunc()”
例如“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 )