获取“全球名称”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 )