获得;全球名称';foo';“未定义”;使用Python';是时候了

获得;全球名称';foo';“未定义”;使用Python';是时候了,python,scope,timeit,Python,Scope,Timeit,我试图找出执行Python语句需要多少时间,所以我在网上查看了一下,发现标准库提供了一个名为的模块,该模块声称可以做到这一点: 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() 但是,这会

我试图找出执行Python语句需要多少时间,所以我在网上查看了一下,发现标准库提供了一个名为的模块,该模块声称可以做到这一点:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第3行,在dotime中
文件“/usr/local/lib/python2.6/timeit.py”,第193行,在timeit中
定时=自内(it、自定时器)
文件“”,第6行,在内部
NameError:未定义全局名称“foo”
我对Python还是新手,我不完全理解它的所有范围问题,但我不知道为什么这个代码段不起作用。有什么想法吗?

更改此行:

t = timeit.Timer("foo()")
为此:

t = timeit.Timer("foo()", "from __main__ import foo")
查看您在最底部提供的链接

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

我刚刚在我的机器上测试了它,它与变化一起工作

t = timeit.Timer("foo()", "from __main__ import foo")
因为时间不在你的范围之内。

你可以试试这个黑客:

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()
将“导入此文件;”添加到设置中

然后在调用设置函数myfunc()时,使用“thisfile.myfunc()”

例如“thisfile.py”


在Python3中,您可以使用
globals=globals()

从:

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


它起作用了!然而,如果我既要提供我希望作为字符串计时的命令,又要导入主模块使其工作,那么这是一个相当愚蠢的界面设计。我认为这对某种类型的人来说是有意义的,但这种类型的人不是我碰巧遇到的人。感谢$Dedity提供Ruby,在我的例子中是。womble,这是一个缺点,不是一般的python名称空间问题。主线程:有与此相关的其他讨论的链接。@Gregg此链接不再可访问(错误404)。讨论的内容是什么?这些链接都是死的。如果你需要复杂的设置代码,这项技术非常棒。比其他回复中给出的启动代码更好(即比
t=timeit.Timer(“foo()”,“from uuu main\uuuu import foo”)
)。特别是如果你想测试几个不同的功能,它将节省大量的打字!我有大约20个导入,所以将它们作为参数传递很快就会变得混乱。这个黑客太棒了!伟大的但是,在python3上,您需要导入内置函数和“内置函数”。可以在time()函数中计时多个函数吗?仅适用于python3
globals
不是Python2的
timeit
的参数,我必须像这样合并
globals
locals
imports_和_vars=globals();导入_和_变量.update(locals())
然后像传递
t=timeit.Timer(“foo()”,globals=imports_和_变量)
def myfunc():

 return 5

def testable(par):

 pass



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

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