Mal zwei schneller als Bitverschiebung, für Python 3.x-Ganzzahlen?

Ich habe nach der Quelle von @ gesucsortierte_container und war überrascht, @ zu sehdiese Lini:

self._load, self._twice, self._half = load, load * 2, load >> 1

Hierload ist eine ganze Zahl. Warum Bitverschiebung an einer Stelle und Multiplikation an einer anderen Stelle verwenden? Es erscheint vernünftig, dass die Bitverschiebung schneller ist als die ganzzahlige Division durch 2, aber warum nicht auch die Multiplikation durch eine Verschiebung ersetzen? Ich habe die folgenden Fälle verglichen:

(mal teilen) (Verschiebung, Verschiebung) (Zeiten, Schicht) (verschieben, teilen)

und festgestellt, dass # 3 durchweg schneller ist als andere Alternativen:

# 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)])

Die Frage

Ist mein Test gültig? Wenn ja, warum ist (multiplizieren, verschieben) schneller als (verschieben, verschieben)?

Ich starte Python 3.5 unter Ubuntu 14.04.

Bearbeite

Above ist die ursprüngliche Aussage der Frage. Dan Getz liefert in seiner Antwort eine hervorragende Erklärung.

Der Vollständigkeit halber hier Beispielabbildungen für größerex wenn keine Multiplikationsoptimierungen angewendet werden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage