一尘不染

为什么“ numpy.any”没有短路机制?

python

我不明白为什么尚未进行如此基本的优化:

In [1]: one_million_ones = np.ones(10**6)
In [2]: %timeit one_million_ones.any()
100 loops, best of 3: 693µs per loop

In [3]: ten_millions_ones = np.ones(10**7)
In [4]: %timeit ten_millions_ones.any()
10 loops, best of 3: 7.03 ms per loop

即使结论是第一项证据,整个阵列也会被扫描。


阅读 193

收藏
2020-12-20

共1个答案

一尘不染

这是不固定的性能下降。NumPy发行3446。实际上 存在
短路逻辑,但是对ufunc.reduce机器的更改在短路逻辑周围引入了不必要的基于块的外循环,并且该外循环不知道如何短路。您可以在此处看到关于分块机制的一些解释。

即使没有回归,短路影响也不会出现在您的测试中。首先,您要确定数组的创建时间,其次,我认为它们没有为布尔值的任何输入dtype放入短路逻辑。从讨论中,听起来好像后面的减少ufunc的机制的细节numpy.any会变得如此困难。

讨论确实提出了令人惊讶的点,即argminandargmax方法似乎会因布尔输入而短路。快速测试显示,自NumPy
1.12(不是最新版本,而是Ideone当前使用的版本)开始,x[x.argmax()]短路,并且它胜过竞争,x.any()并且x.max()对于一维布尔输入,无论输入是小还是大,并且没有短路是否还很重要。奇怪的!

2020-12-20