我不明白为什么尚未进行如此基本的优化:
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
即使结论是第一项证据,整个阵列也会被扫描。
这是不固定的性能下降。NumPy发行3446。实际上 存在 短路逻辑,但是对ufunc.reduce机器的更改在短路逻辑周围引入了不必要的基于块的外循环,并且该外循环不知道如何短路。您可以在此处看到关于分块机制的一些解释。
ufunc.reduce
即使没有回归,短路影响也不会出现在您的测试中。首先,您要确定数组的创建时间,其次,我认为它们没有为布尔值的任何输入dtype放入短路逻辑。从讨论中,听起来好像后面的减少ufunc的机制的细节numpy.any会变得如此困难。
numpy.any
讨论确实提出了令人惊讶的点,即argminandargmax方法似乎会因布尔输入而短路。快速测试显示,自NumPy 1.12(不是最新版本,而是Ideone当前使用的版本)开始,x[x.argmax()]短路,并且它胜过竞争,x.any()并且x.max()对于一维布尔输入,无论输入是小还是大,并且没有短路是否还很重要。奇怪的!
argmin
argmax
x[x.argmax()]
x.any()
x.max()