当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Python的timeit来定义"全局名称'foo'"》经验,为你挑选了4个好方法。

我试图找出执行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 "", line 1, in 
  File "", line 3, in dotime
  File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "", line 6, in inner
NameError: global name 'foo' is not defined

我还是Python新手,我不完全理解它所有的范围问题,但我不知道为什么这个片段不起作用.有什么想法吗?



1> Paolo Bergan..:

改变这一行:

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

对此:

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

查看最底部提供的链接.

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

我只是在我的机器上测试它,它适用于变化.


有用!但是,如果我必须同时提供我希望作为字符串输入的命令并导入__main__模块以使其工作,那么这是一个非常愚蠢的界面设计.
womble,这是一个疣,而不是一般的python命名空间问题.主要内容:http://writeonly.wordpress.com/2008/09/12/using-python-timeit-to-time-functions/有关于此的其他讨论的链接.
Python命名空间对我来说是完全疯狂的.我认为这对某种心灵来说是有意义的,但这种心灵并不是我想要的.感谢$ DEITY for Ruby,就我而言.
那些链接都死了

2> 小智..:

你可以试试这个黑客:

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


大!但是在python3上你需要`import builtins`和'builtins .__ dict __.update(locals())'

3> user2314737..:

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

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

从文档:

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


仅适用于Python 3.`globals`不是Python 2的`timeit`的参数

4> dwc..:
t = timeit.Timer("foo()", "from __main__ import foo")

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

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有