В два раза быстрее, чем бит-сдвиг, для целых чисел Python 3.x?

Я смотрел на источник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)])

Вопрос:

Мой тест действителен? Если так, почему (умножение, сдвиг) быстрее, чем (сдвиг, сдвиг)?

Я запускаю Python 3.5 на Ubuntu 14.04.

редактировать

Выше оригинальное изложение вопроса. Дэн Гетц дает превосходное объяснение в своем ответе.

Для полноты картины, вот примеры иллюстраций для большегоx когда оптимизации умножения не применяются.

Ответы на вопрос(1)

Ваш ответ на вопрос