【问题标题】:timeit module in python does not recognize numpy modulepython中的timeit模块无法识别numpy模块
【发布时间】:2014-02-08 13:44:29
【问题描述】:

我想测试两个相同列表之间的处理时间,特别是普通列表和 numpy 列表。我的代码是

import timeit
import numpy as np

t = timeit.Timer("range(1000)")
print t.timeit()

u = timeit.Timer("np.arange(1000)")
print u.timeit()

t 的计算很好,但对于 u NameError: global name 'np' is not defined 已列出。

我应该如何编码以获得处理时间?

【问题讨论】:

    标签: python numpy timeit


    【解决方案1】:

    timeit.Timer 类可以以两种不同的方式使用。

    它可以采用源代码来编译和执行——在这种情况下,代码在只运行 setup 代码的新环境中执行,或者它可以采用可调用对象,在这种情况下,可调用对象只是被调用(在您当前的环境中,就像任何其他可调用对象一样)。

    所以,你有两个选择:

    u = timeit.Timer("np.arange(1000)", setup='import numpy as np')
    

    ……或……

    u = timeit.Timer(lambda: np.arange(1000))
    

    在第一种情况下,您碰巧完成了import numpy as np 的事实是无关紧要的;它对编译和执行np.arange(1000) 的环境没有影响(因此您必须将它包含在setup=... 位中)。

    在第二种情况下,您执行 import numpy as np 的事实显然相关 - 它会影响您的代码(包括 lambda: np.arange(1000))被评估的环境。 p>

    【讨论】:

      【解决方案2】:

      使用setup参数:

      u = timeit.Timer("np.arange(1000)", setup='import numpy as np')
      

      【讨论】:

      • 感谢您的代码。既然知道了时间,那你知道为什么普通列表中的时间(10.4s)比数组(1.9s)要长很多吗?
      • @user3211991 range(1000) 在内存中创建列表,尝试用 xrange(1000) 替换 range(1000),stackoverflow.com/questions/94935/…
      • 有关 range 和 np.arange 之间效率的更多详细信息,另请参阅 stackoverflow.com/questions/10698858/…
      • @user3211991:这确实是一个完全独立的问题......但一般来说,创建 1000 个 Python int 对象加上一个保存它们的列表将比创建和初始化一个包含 1000 个 C int 的数组花费更长的时间对象。这是 NumPy 的一半——不“装箱” Python 对象中的每个值可以节省所有装箱和拆箱时间。 (另一半是它还为这 1000 个“盒子”节省了内存。而第三半——因为 NumPy 足够酷,拥有超过 100% 的优点——它为元素操作提供了很好的 API .)
      【解决方案3】:

      要将导入的库与 timeit 一起使用,您必须使用 setup 关键字参数 (docs) 导入它们:

      import timeit
      
      # Doesn't require setup kwarg as range doesn't need to be imported.
      t = timeit.Timer("range(1000)")
      print t.timeit()
      
      # Requires the import of numpy (as np) through the setup kwarg.
      u = timeit.Timer("np.arange(1000)", setup = 'import numpy as np')
      print(u.timeit())
      

      setup 关键字参数允许您设置代码,例如导入外部库或通过使用 from __main__ import func 从代码中导入函数。

      【讨论】:

      • 不,您不必使用 setup 关键字参数导入它们。如果您传递的是可调用对象而不是要编译的代码,则可调用对象已经在您的正常环境中编译(包括任何 import 语句)并且可以正常运行。
      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多