使用Python的timeit来定义“全局名称'foo'”

时间:2009-02-15 23:15:40

标签: python scope timeit

我正在试图找出执行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的新手,我不完全理解它所有的范围问题,但我不知道为什么这个片段不起作用。有什么想法吗?

5 个答案:

答案 0 :(得分:88)

更改此行:

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

对此:

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

查看最底部提供的链接。

  

要让timeit模块访问您定义的函数,您可以传递一个包含import语句的setup参数:

我刚刚在我的机器上对它进行了测试,并且可以使用这些更改。

答案 1 :(得分:20)

你可以试试这个黑客:

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

答案 2 :(得分:16)

使用Python 3,您可以使用globals=globals()

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

来自documentation

  

另一种选择是将globals()传递给globals参数   将导致代码在您当前的全局范围内执行   命名空间。这比单独指定更方便   进口

答案 3 :(得分:8)

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

因为timeit没有你的东西。

答案 4 :(得分:0)

添加到您的设置&#34;导入此文件; &#34;

然后当你调用setup函数时myfunc()使用&#34; thisfile.myfunc()&#34;

例如&#34; thisfile.py&#34;

def myfunc():

 return 5

def testable(par):

 pass



t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)

print( t )