ฉันดูที่แหล่งที่มาของsort_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
แก้ไข
ด้านบนเป็นข้อความดั้งเดิมของคำถาม Dan Getz ให้คำอธิบายที่ดีเยี่ยมในคำตอบของเขา
เพื่อความสมบูรณ์นี่คือตัวอย่างของตัวอย่างที่มีขนาดใหญ่กว่าx
เมื่อไม่ใช้การเพิ่มประสิทธิภาพการคูณ
x
จะมีขนาดใหญ่มากเพราะนั่นเป็นเพียงคำถามที่ว่ามันถูกเก็บไว้ในหน่วยความจำใช่ไหม?
x
ที่ไหน