क्या पायथन में आदेश दिए गए हैं 3.6+?
उन्हें सम्मिलित आदेश दिया गया है [1] । अजगर के 3.6 के रूप में, अजगर के सीपीथॉन कार्यान्वयन के लिए, शब्दकोशों में डाले गए आइटमों के क्रम को याद करते हैं । इसे पायथन 3.6 में एक कार्यान्वयन विवरण माना जाता है ; OrderedDict
यदि आप सम्मिलन आदेश चाहते हैं, तो आपको इसका उपयोग करने की आवश्यकता है जो कि पायथन के अन्य कार्यान्वयन (और अन्य आदेशित व्यवहार [1] ) के लिए गारंटी है ।
पायथन 3.7 के रूप में , यह अब एक कार्यान्वयन विवरण नहीं है और इसके बजाय एक भाषा सुविधा बन जाती है। GvR द्वारा एक अजगर-देव संदेश से :
इसे ऐसा बनाओ। "निर्णय प्रविष्टि आदेश रखता है" सत्तारूढ़ है। धन्यवाद!
इसका सीधा सा मतलब है कि आप इस पर निर्भर हो सकते हैं । पायथन के अन्य कार्यान्वयन भी एक आदेश दिया शब्दकोश की पेशकश अगर वे अजगर 3.7 के अनुरूप कार्यान्वयन होना चाहते हैं।
पायथन 3.6
डिक्शनरी कार्यान्वयन तत्व आदेश को संरक्षित करते हुए पुराने से बेहतर [2] कैसे करता है ?
अनिवार्य रूप से, दो सरणियों को रखकर ।
पहला सरणी, शब्दकोश में dk_entries
प्रविष्टियाँ दर्ज करने के लिए प्रविष्टियाँ ( प्रकार केPyDictKeyEntry
) रखता है जो उन्हें सम्मिलित किया गया था। परिरक्षण आदेश इसे केवल एक परिशिष्ट के रूप में प्राप्त किया जाता है जहां नई वस्तुओं को हमेशा अंत (प्रविष्टि क्रम) में डाला जाता है।
दूसरा, सरणी के dk_indices
लिए सूचकांकों को रखता है dk_entries
(अर्थात, मान जो संबंधित प्रविष्टि की स्थिति को इंगित करते हैं dk_entries
)। यह सरणी हैश तालिका के रूप में कार्य करती है। जब एक कुंजी को हैश किया जाता है, तो यह एक इंडेक्स में जमा हो जाता है dk_indices
और संबंधित प्रविष्टि को अनुक्रमण द्वारा लाया जाता है dk_entries
। चूंकि केवल सूचकांक रखे जाते हैं, इस सरणी का प्रकार शब्द के समग्र आकार (प्रकार int8_t
( 1
बाइट) से लेकर ) int32_t
/ int64_t
( 4
/ 8
बाइट्स) 32
/ 64
बिट बिल्ड पर निर्भर करता है)
पिछले कार्यान्वयन में, प्रकार PyDictKeyEntry
और आकार का एक विरल सरणी dk_size
आवंटित किया जाना था; दुर्भाग्य से, इसके परिणामस्वरूप बहुत सारी खाली जगह थी क्योंकि प्रदर्शन कारणों से उस सरणी को 2/3 * dk_size
पूर्ण से अधिक नहीं होने दिया गया था । (और खाली जगह का आकार अभी भी था !)।PyDictKeyEntry
यह अब ऐसा नहीं है क्योंकि केवल आवश्यक प्रविष्टियों को संग्रहीत किया जाता है (जिन्हें डाला गया है) और प्रकार का एक विरल सरणी intX_t
( X
तानाशाह के आकार के आधार पर) 2/3 * dk_size
पूर्ण रखा गया है। खाली जगह प्रकार से बदल PyDictKeyEntry
करने के लिए intX_t
।
तो, जाहिर है, प्रकार PyDictKeyEntry
का एक विरल सरणी बनाने के भंडारण के लिए विरल सरणी की तुलना में बहुत अधिक स्मृति की मांग है int
।
यदि आप रुचि रखते हैं, तो इस फीचर के बारे में आप पायथन-देव पर पूरी बातचीत देख सकते हैं , यह एक अच्छा रीड है।
रेमंड हेटिंगर द्वारा किए गए मूल प्रस्ताव में, उपयोग किए गए डेटा संरचनाओं का एक दृश्य देखा जा सकता है जो विचार के सार को पकड़ लेता है।
उदाहरण के लिए, शब्दकोश:
d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'}
वर्तमान में [कुंजीहश, कुंजी, मान] के रूप में संग्रहीत किया जाता है:
entries = [['--', '--', '--'],
[-8522787127447073495, 'barry', 'green'],
['--', '--', '--'],
['--', '--', '--'],
['--', '--', '--'],
[-9092791511155847987, 'timmy', 'red'],
['--', '--', '--'],
[-6480567542315338377, 'guido', 'blue']]
इसके बजाय, डेटा को निम्नानुसार व्यवस्थित किया जाना चाहिए:
indices = [None, 1, None, None, None, 0, None, 2]
entries = [[-9092791511155847987, 'timmy', 'red'],
[-8522787127447073495, 'barry', 'green'],
[-6480567542315338377, 'guido', 'blue']]
जैसा कि आप नेत्रहीन अब देख सकते हैं, मूल प्रस्ताव में, टकराव को कम करने और लुक-अप को तेज करने के लिए बहुत सारी जगह अनिवार्य रूप से खाली है। नए दृष्टिकोण के साथ, आप स्पार्सिटी को स्थानांतरित करके आवश्यक मेमोरी को कम कर देते हैं जहां यह वास्तव में आवश्यक है, सूचकांकों में।
[१]: मैं कहता हूं कि "सम्मिलन का आदेश दिया गया" और न कि "आदेश" के बाद से, ऑर्डरडिक्ट के अस्तित्व के साथ, "आदेशित" आगे के व्यवहार का सुझाव देता है जो dict
वस्तु प्रदान नहीं करता है । ऑर्डरडाइसीट रिवर्सिबल हैं, ऑर्डर संवेदनशील तरीके प्रदान करते हैं और, मुख्य रूप से, ऑर्डर-सेंसिटिव इक्विलिटी टेस्ट ( ==
, !=
) प्रदान करते हैं । dict
वर्तमान में उन व्यवहारों / विधियों में से कोई भी प्रस्ताव नहीं है।
[२]: नया शब्दकोश कार्यान्वयन अधिक कॉम्पैक्ट रूप से डिज़ाइन किए जाने से बेहतर मेमोरी वार करता है ; यहाँ मुख्य लाभ है। गति के अनुसार, अंतर इतना कठोर नहीं है, ऐसे स्थान हैं जहां नए तानाशाह मामूली प्रतिगमन ( मुख्य-लुकअप, उदाहरण के लिए ) पेश कर सकते हैं , जबकि अन्य में (पुनरावृत्ति और मन में आते हुए) एक प्रदर्शन को बढ़ावा देना चाहिए।
कुल मिलाकर, शब्दकोश की कार्यक्षमता, विशेष रूप से वास्तविक जीवन की स्थितियों में, कॉम्पैक्टनेस की वजह से सुधार होता है।