【发布时间】: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 需要每次比较数字并且有时更新,我认为添加应该比比较慢)。事实上,情况恰恰相反。为什么?
【问题讨论】:
-
有一篇关于
any()的相关帖子:stackoverflow.com/questions/17128116/… -
我很好奇,为什么你认为
max应该比sum快?我可以理解期望两者都同样快,或者sum比any快。 -
由于 CPU 的构建方式,条件表达式通常比算术表达式慢:stackoverflow.com/questions/9820319/…
-
@gerrit:添加和比较的速度通常是相同的,而 branching(max 需要,但 sum 不需要)要慢得多。特别是,分支错误预测可能会花费多达 60 次加法。