मैं sorted_containers का स्रोत देख रही है और this line देख कर हैरान था:टाइम्स दो बिट शिफ्ट से तेज है?
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_swaped():
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_swaped),
}
def get_observations():
return pd.DataFrame([observe(k) for k in range(100)])
प्रश्न:
अपने परीक्षण मान्य है? यदि हां, तो क्यों (गुणा, शिफ्ट) (शिफ्ट, शिफ्ट) से तेज है?
मैं उबंटू 14.04 पर पायथन 3.5 चलाता हूं।
संपादित
से ऊपर प्रश्न के मूल बयान है। दान गेटज़ अपने जवाब में एक उत्कृष्ट स्पष्टीकरण प्रदान करता है।
पूर्णता के लिए, यहां बड़े x
के लिए नमूना चित्रण हैं जब गुणा ऑप्टिमाइज़ेशन लागू नहीं होते हैं।
आपने 'x' कहां परिभाषित किया? – JBernardo
मैं वास्तव में देखना चाहता हूं कि थोड़ा एंडियन/बड़ा एंडियन का उपयोग करके कोई अंतर है या नहीं। वास्तव में सवाल कूल बीटीडब्ल्यू! – LiGhTx117
जेबर्नर्डो, यह पुनः लोड के साथ मेरे इंटरैक्टिव सत्र में खो गया। एक संपादन कर देगा। परिणाम सुसंगत लगते हैं। –