【问题标题】:timeit is not working in the python manage.py shelltimeit 在 python manage.py shell 中不起作用
【发布时间】:2015-11-26 12:31:00
【问题描述】:

我必须花时间在 django 项目中运行查询,即python manage.py shell

代码:

>>> import timeit
>>> d = {"a":1, "b":2}
>>> def a1():
...     for i in d:
...         a = i, d[i]
... 
>>> a1()


>>> print "Time 1:", timeit.timeit('a1()', 'from __main__ import a1 as a1')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib64/python2.6/timeit.py", line 227, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "/usr/lib64/python2.6/timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 3, in inner
ImportError: cannot import name a1
Time 1: >>>

这在 python manage.py shell 中不起作用

但这是工作文件,我在 py 文件中编写代码并运行我的命令行。

from __main__ import a1 as a1有问题

【问题讨论】:

    标签: python django django-manage.py


    【解决方案1】:

    timeit 在不同的上下文中执行,因此它无法访问您导入/定义的符号。

    为此,您可以:

    使用其构造函数的setup参数。

    timeit.timeit("a1()", setup="from __main__ import a1 as a1")
    

    使用其构造函数的globals 参数(Python >= 3.5)来传递全局命名空间。

    timeit.timeit("a1()", globals=globals())
    

    有关详细信息,请参阅doc

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但没有找到真正的解决方案。像您的示例中的几行代码一样有效的方法是将它们直接放在 timeit() 的 setup 参数中:

      >>> setup = 'd={"a":1, "b":2}\ndef a1():\n    for i in d:\n        a = i, d[i]\n'
      >>> print "Time 1:", timeit.timeit('a1()', setup)
      Time 1: 0.337239027023
      

      然而,虽然它不能帮助解释为什么 timeit 中的导入在 django shell 中不起作用,但为什么不实现自己的计时功能呢?

      >>> import time 
      >>> def time_function(fnc, number=10**6):
      >>>     start = time.time()
      >>>     for i in xrange(number):
      >>>         fnc()
      >>>     return time.time() - start
      
      >>> print "Time 1:", time_function(a1)
      Time 1: 0.3310558795928955
      

      【讨论】:

      • 是的,我是通过开始和结束时间的方法完成的。
      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 2020-09-02
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2020-11-28
      • 2019-09-10
      相关资源
      最近更新 更多