【发布时间】: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 年了。