为什么.sum()比.any()或.max()更快?

ger*_*rit 8 python numpy

在优化代码的慢速部分时,我惊讶于A.sum()几乎是以下两倍的事实A.max():

In [1]: A = arange(10*20*30*40).reshape(10, 20, 30, 40)

In [2]: %timeit A.max()
1000 loops, best of 3: 216 us per loop

In [3]: %timeit A.sum()
10000 loops, best of 3: 119 us per loop

In [4]: %timeit A.any()
1000 loops, best of 3: 217 us per loop
Run Code Online (Sandbox Code Playgroud)

我原本预计A.any()会更快(它应该只检查一个元素!),然后A.max(),这A.sum()将是最慢的(sum()需要添加数字并每次更新一个值,max需要每次比较数字并有时更新,我认为添加应该比比较慢.事实上,情况正好相反.为什么?

P45*_*ent 1

max必须存储一个值,不断检查潜在的更新(CPU 需要执行分支操作来实现这些更新)。sum只是搅动价值观。

所以sum会更快。

  • 不。它更快,因为它不需要分支。众所周知,当分支预测没有失败时,现代处理器的性能要好得多。`sum()` 完全避免任何分支,因此全速运行。 (2认同)