最佳答案
self._load, self._twice, self._half = load, load * 2, load >> 1
这里的 load
是一个整数。为什么在一个地方使用位移,而在另一个地方使用乘法?比特移位可能比积分除法快2,这似乎是合理的,但为什么不用移位来代替乘法呢?我以下列情况为基准:
结果发现,第三种选择总是比其他选择更快:
# self._load, self._twice, self._half = load, load * 2, load >> 1
import random
import timeit
import pandas as pd
x = random.randint(10 ** 3, 10 ** 6)
def test_naive():
a, b, c = x, 2 * x, x // 2
def test_shift():
a, b, c = x, x << 1, x >> 1
def test_mixed():
a, b, c = x, x * 2, x >> 1
def test_mixed_swapped():
a, b, c = x, x << 1, x // 2
def observe(k):
print(k)
return {
'naive': timeit.timeit(test_naive),
'shift': timeit.timeit(test_shift),
'mixed': timeit.timeit(test_mixed),
'mixed_swapped': timeit.timeit(test_mixed_swapped),
}
def get_observations():
return pd.DataFrame([observe(k) for k in range(100)])
问题是:
我的测试有效吗? 如果有效,为什么(乘法,移位)比(移位,移位)快?
我在 Ubuntu 14.04上运行 Python 3.5。
剪辑
以上是这个问题的原始陈述,丹 · 盖茨在他的回答中给出了很好的解释。
为了完整起见,下面是不适用乘法优化的较大 x
的示例说明。