【问题标题】:Why Can I Not Replicate the NumPy v1.13.dev0 Manual Examples为什么我不能复制 NumPy v1.13.dev0 手册示例
【发布时间】:2017-11-25 01:55:52
【问题描述】:

作为一个例子,我正在阅读以下内容:

https://docs.scipy.org/doc/numpy-dev/neps/new-iterator-ufunc.html

所以我使用 iPython 在我的计算机上运行了一些代码,例如手册中所示:

   def iter_add_itview(x, y, out=None):
        it = np.nditer([x,y,out], [],
                    [['readonly'],['readonly'],['writeonly','allocate']])

        (a, b, c) = it.itviews
        np.add(a, b, c)

        return it.operands[2]

每个示例的测试用例结果如下:

In [10]: a = np.arange(1000000,dtype='f4').reshape(100,100,100).T
In [12]: b = np.arange(10000,dtype='f4').reshape(100,100,1).T
In [11]: c = np.arange(10000,dtype='f4').reshape(1,100,100).T

In [4]: timeit np.add(np.add(np.add(a,b), c), a)
1 loops, best of 3: 99.5 ms per loop

In [9]: timeit iter_add_itview(iter_add_itview(iter_add_itview(a,b), c), a)
10 loops, best of 3: 29.3 ms per loop

所以我很自然地想为自己在带有英特尔芯片组的 Linux 上的 Python 2.7 中使用 NumPy1.12.1 尝试这种兴奋,唯一的问题是,对于与上面示例完全相同的实验设置,我始终得到空结果:

In [12]: timeit np.add(np.add(np.add(a,b), c), a)
100 loops, best of 3: 10.7 ms per loop

In [13]: timeit iter_add_itview(iter_add_itview(iter_add_itvie
    ...: w(a,b), c), a)
100 loops, best of 3: 10.7 ms per loop

在这种情况下,我应该看到缓冲区缓存优化的改进。

为什么我无法使用旧版本的代码为更新的 NumPy 版本复制开发手册的一部分?

【问题讨论】:

  • 这些改进可能已经包含在标准的 ufunc 实现中。
  • 所以开发手册提前发布但已过时?
  • 他们不会仅仅因为 NEP 已经实施就将其从文档中删除。他们只是将它们放在“已实施的 NEP”部分下,就像这个一样。
  • 转到NEP overview page,您会在已实施部分看到这个。
  • 请注意,您正在阅读的文档是 2010 年的。超过 6 年了。

标签: python numpy


【解决方案1】:

为了清楚起见,In[4][9] 时间是从那个 6 年前的文档中复制的。 [12][13] 时间来自您自己的测试(与我得到的基本相同)。我还没有研究过那个旧的dev 文档,但是已经在上面运行了np.nditer 示例

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html

并且知道nditer 通常不会加速代码。此迭代器旨在用于 C 级代码,它在 Python 级的公开是一种方便。它让我们可以在将想法转移到 C 或 Cython 之前在 Python 代码中测试想法。请注意最后的 Cython 示例。即便如此,我发现通过使用 Cython memoryviews,我可以在简单的乘法案例中获得更快的速度。

np.ndindex 是少数在 Python 代码中使用 np.nditernumpy 函数之一。我偶尔会建议一种类似的模式来产生深度有限的迭代。

所以不要太担心掌握np.nditer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多