【问题标题】:Why is .sum() faster than .any() or .max()?为什么 .sum() 比 .any() 或 .max() 快?
【发布时间】:2014-04-18 23:42:31
【问题描述】:

在优化我的代码的慢速部分时,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

我原以为A.any() 会快得多(它应该只需要检查一个元素!),其次是A.max(),而A.sum() 会最慢(sum() 需要添加数字和每次更新一个值,max 需要每次比较数字并且有时更新,我认为添加应该比比较慢)。事实上,情况恰恰相反。为什么?

【问题讨论】:

标签: python numpy


【解决方案1】:

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

所以sum 会更快。

【讨论】:

  • 没有。它更快,因为它不必分支。众所周知,当分支预测没有失败时,现代处理器的性能要好得多。 sum() 完全避开任何分支,从而全速运行。
  • @Bakuriu 尝试使用排序列表(没有分支预测失败)来检查该声明
  • @wim 除非重塑影响迭代顺序(我对此表示怀疑),否则问题中的数组 是 排序的(特别是升序),因为它来自arange .
  • 嗯,没注意到。但是我们怎么知道A.any实现了和A.flat同方向遍历数组呢?
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2011-11-20
  • 2023-03-31
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多