99

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

4

5 回答 5

96

更改此行:

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

对此:

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

查看您在最底部提供的链接。

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

我刚刚在我的机器上对其进行了测试,并且它适用于这些更改。

于 2009-02-15T23:18:42.247 回答
36

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

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

文档中:

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

于 2017-09-05T12:51:41.797 回答
21

你可以试试这个技巧:

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()
于 2011-03-22T11:16:51.940 回答
8
t = timeit.Timer("foo()", "from __main__ import foo")

由于 timeit 没有你的东西在范围内。

于 2009-02-15T23:22:16.793 回答
0

添加到您的设置“导入此文件;”

然后当你调用设置函数 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 )
于 2017-06-01T22:45:10.367 回答