python - पायथन में छोटे सेट का प्रदर्शन




list set (2)

मैं पायथन में दी गई श्रेणी (0-10) में छोटे अंकों के पूर्णांक का प्रतिनिधित्व करने का सबसे कारगर तरीका ढूंढ रहा हूं इस मामले में, दक्षता का अर्थ तेजी से निर्माण होता है (एक निरर्थक सूची से), तेजी से प्रश्न (प्रत्येक सेट पर कुछ प्रश्न), और एक सॉर्ट किए गए संस्करण (संभवतः प्रति दस सेटों में एक बार) के तेजी से निर्माण एक प्राथमिकता से उम्मीदवार अजगर के बिल्टिन सेट प्रकार (फास्ट क्वेरी) का उपयोग कर रहे हैं, एक सॉर्ट किए गए एरे (संभवतः constrct to fast?), या बिट-अर्रे का उपयोग करके (अगर मैं सी में था तो सब कुछ फास्ट ...) लेकिन मुझे संदेह है कि अजगर होगा वह कुशल (?)) किसी भी सलाह का चयन करने के लिए कौन?

धन्यवाद।


इस मामले में आप केवल सच / असत्य मूल्यों की सूची का उपयोग कर सकते हैं। set द्वारा प्रयोग की गई हैश तालिका एक ही बात कर रही होगी, लेकिन इसमें हैशिंग, बाल्टी असाइनमेंट और टकराव का पता लगाने के लिए ओवरहेड शामिल होगा।

myset = [False] * 11
for i in values:
    myset[i] = True
mysorted = [i for i in range(11) if myset[i]]

हमेशा की तरह आपको यह पता करने की आवश्यकता है कि यह आपकी परिस्थितियों में कैसे काम करता है।


मेरी सलाह है कि अंतर्निहित set() साथ रहना है पायथन कोड लिखना बहुत मुश्किल होगा, जो प्रदर्शन के लिए निर्मित सी कोड को धड़कता है। निर्माण की गति और लांच की गति सबसे तेज होगी यदि आप अंतर्निहित सी कोड पर निर्भर हैं।

सॉर्ट की गई सूची के लिए, सबसे अच्छी शर्त आपको अंतर्निहित सॉर्ट सुविधा का उपयोग करना है:

x = set(seq) # build set from some sequence
lst = sorted(x)  # get sorted list from set

सामान्य तौर पर, पायथन में, कम कोड जो आप लिखते हैं, तेज़ है। जितना अधिक आप पायथन के अंतर्निहित सी आधार पर, भरोसा कर सकते हैं। व्याख्या की गई पायथन कई मामलों में सी कोड के मुकाबले 20x से 100x धीमी है, और इतनी चतुर हो कि आप बनाम बनाते हैं, केवल अंतर्निहित सुविधाओं का उपयोग करते हुए, जैसा कि इरादा है

यदि आपका सेट हमेशा [0, 10] की श्रेणी में पूर्णांक होने की गारंटी है, और आप यह सुनिश्चित करना चाहते हैं कि मेमोरी पदचिह्न जितना छोटा हो, उतना छोटा हो, फिर पूर्णांक के अंदर बिट-फ्लैग जाने का रास्ता होगा।

pow2 = [2**i for i in range(32)]

x = 0  # set with no values
def add_to_int_set(x, n):
    return x | pow2[n]

def in_int_set(x, n):
    return x & pow2[n]

def list_from_int_set(x):
    return [i for i in range(32) if x & pow2[i]]

मैं शर्त लगा सकता हूँ कि यह वास्तव में अंतर्निहित set() फ़ंक्शंस के उपयोग से धीमी है, लेकिन आप जानते हैं कि प्रत्येक समूह सिर्फ एक int ऑब्जेक्ट होगा: 4 बाइट्स, प्लस पायथन ऑब्जेक्ट के ओवरहेड।

यदि आप सचमुच उनमें से अरबों की आवश्यकता है, तो आप एक पायथन सूची के बजाय एक NumPy array का उपयोग करके स्थान को बचा सकते हैं; NumPy array केवल नंगे पूर्णांक संग्रहित करेगा वास्तव में, NumPy में एक 16-बिट पूर्णांक प्रकार है, इसलिए यदि आपके सेट वास्तव में केवल [0, 10] की सीमा में हैं तो आप NumPy array का उपयोग करके प्रत्येक संग्रहण का आकार दो बाइट्स में प्राप्त कर सकते हैं।

http://www.scipy.org/FAQ#head-16a621f03792969969e44df8a9eb360918ce9613





bitarray