我正在查看sorted_containers的来源,很惊讶地看到这一行:
self._load, self._twice, self._half = load, load * 2, load >> 1
这load
是整数。为什么在一个位置使用位移,而在另一位置使用乘法?移位可能比整数除以2快,但这是合理的,但是为什么不还用移位代替乘法呢?我对以下情况进行了基准测试:
- (时间,分)
- (班次,班次)
- (时间,班次)
- (平移,除法)
并发现#3始终比其他替代方法快:
# 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。
编辑
以上是问题的原始陈述。Dan Getz在回答中提供了出色的解释。
为了完整起见,以下是x
不适用乘法优化时的较大示例示例。
x
非常大,因为那只是关于它如何存储在内存中的问题,对吗?
x
?