python - क्या पायथन में आदेश दिए गए हैं 3.6+?




python-3.x dictionary (3)

पिछले अवतारों के विपरीत, पायथन 3.6 (कम से कम CPython कार्यान्वयन के तहत) में आदेश दिए गए हैं। यह एक पर्याप्त बदलाव की तरह लगता है, लेकिन यह documentation में केवल एक छोटा पैराग्राफ है। इसे भाषा सुविधा के बजाय CPython कार्यान्वयन विवरण के रूप में वर्णित किया गया है, लेकिन इसका तात्पर्य यह है कि भविष्य में यह मानक बन सकता है।

तत्व आदेश को संरक्षित करते हुए नया शब्दकोश कार्यान्वयन पुराने से बेहतर प्रदर्शन कैसे करता है?

यहाँ प्रलेखन से पाठ है:

dict() अब PyPy द्वारा अग्रणी "कॉम्पैक्ट" प्रतिनिधित्व का उपयोग करता है। पायथन 3.5 की तुलना में नए तानाशाह () की मेमोरी का उपयोग 20% से 25% कम है। PEP 468 (एक समारोह में ** kwargs के आदेश का संरक्षण।) इसके द्वारा कार्यान्वित किया जाता है। इस नए कार्यान्वयन के आदेश-संरक्षण पहलू को एक कार्यान्वयन विवरण माना जाता है और इस पर भरोसा नहीं किया जाना चाहिए (यह भविष्य में बदल सकता है, लेकिन यह भाषा में इस नए तानाशाही कार्यान्वयन के लिए वांछित है कि भाषा बदलने से पहले कुछ रिलीज के लिए सभी वर्तमान और भविष्य के पायथन कार्यान्वयन के लिए ऑर्डर-प्रोटेक्टिंग शब्दार्थों को अनिवार्य करने के लिए; यह भाषा के पुराने संस्करणों के साथ पीछे-संगतता को बनाए रखने में मदद करता है जहां यादृच्छिक पुनरावृत्ति क्रम अभी भी प्रभाव में है, जैसे कि पायथन 3.5)। ( 27350 अंक में ईनाडा नोकी द्वारा योगदान। आइडिया मूल रूप से रेमंड हेटिंग द्वारा सुझाया गया है )।

दिसंबर 2017 अपडेट करें: पाइथन 3.7 के लिए तानाशाही प्रविष्टि को बनाए रखने की guaranteed


क्या पायथन में आदेश दिए गए हैं 3.6+?

उन्हें सम्मिलित किए गए आदेश दिए गए हैं [1] । अजगर के 3.6 के रूप में, अजगर के सीपीथॉन कार्यान्वयन के लिए, शब्दकोशों में डाले गए आइटमों के क्रम को याद करते हैं इसे पायथन 3.6 में एक कार्यान्वयन विस्तार माना जाता है ; यदि आप सम्मिलन आदेश का उपयोग करना चाहते हैं, तो आपको पायथन के अन्य कार्यान्वयनों (और अन्य आदेशित व्यवहार [1] ) की गारंटी चाहिए

पायथन 3.7 के रूप में , यह अब एक कार्यान्वयन विवरण नहीं है और इसके बजाय एक भाषा सुविधा बन जाती है। guaranteed :

इसे ऐसा बनाओ। "निर्णय प्रविष्टि आदेश रखता है" सत्तारूढ़ है। धन्यवाद!

इसका सीधा सा मतलब है कि आप इस पर निर्भर हो सकते हैं । पायथन के अन्य कार्यान्वयन भी एक आदेश दिया शब्दकोश की पेशकश अगर वे अजगर 3.7 के अनुरूप कार्यान्वयन होना चाहते हैं।

Python 3.6 डिक्शनरी कार्यान्वयन तत्व आदेश को संरक्षित करते हुए पुराने से बेहतर [2] कैसे करता है?

अनिवार्य रूप से, दो सरणियों को रखकर

  • पहली सरणी, dk_entries , प्रविष्टियाँ ( प्रकार PyDictKeyEntry ) को इस क्रम में शब्दकोश के लिए रखती है कि उन्हें डाला गया था। परिरक्षण आदेश इसे केवल एक परिशिष्ट के रूप में प्राप्त किया जाता है जहां नई वस्तुओं को हमेशा अंत (प्रविष्टि क्रम) में डाला जाता है।

  • दूसरा, dk_indices , dk_entries सरणी के लिए सूचकांक रखता है (अर्थात, मान जो dk_entries में संबंधित प्रविष्टि की स्थिति को इंगित करता है)। यह सरणी हैश तालिका के रूप में कार्य करती है। जब एक कुंजी को हैश किया जाता है तो यह dk_indices में संग्रहीत सूचकांकों में से एक की ओर जाता है और संबंधित प्रविष्टि dk_entries को अनुक्रमित करके लाया जाता है। चूंकि केवल सूचकांक रखे जाते हैं, इस सरणी का प्रकार शब्द के समग्र आकार (प्रकार int8_t ( 1 बाइट) से लेकर int32_t / int64_t ( int64_t बाइट्स) तक 64 बिट बिल्ड पर निर्भर करता है

पिछले कार्यान्वयन में, PyDictKeyEntry और आकार dk_size का एक विरल सरणी आवंटित किया जाना था; दुर्भाग्य से, इसके परिणामस्वरूप बहुत सारी खाली जगह थी क्योंकि प्रदर्शन कारणों से यह सरणी 2/3 * dk_size से अधिक होने की अनुमति नहीं थी। (और रिक्त स्थान में अभी भी PyDictKeyEntry आकार था!)।

यह अब ऐसा नहीं है क्योंकि केवल आवश्यक प्रविष्टियों को संग्रहीत किया जाता है (जिन्हें डाला गया है) और प्रकार का एक विरल प्रकार intX_t ( X आकार के आधार पर) 2/3 * dk_size पूरा रखा गया है। खाली स्थान PyDictKeyEntry से intX_t बदल गया।

तो, जाहिर है, PyDictKeyEntry प्रकार का एक विरल सरणी बनाने के लिए int s भंडारण के लिए एक विरल सरणी की तुलना में अधिक स्मृति की मांग है।

यदि आप रुचि रखते हैं, तो इस फीचर के बारे में आप mail.python.org/pipermail/python-dev/2016-September/146327.html पूरी बातचीत देख सकते हैं, यह एक अच्छा रीड है।

रेमंड हेटिंगर द्वारा किए गए मूल प्रस्ताव में, उपयोग किए गए डेटा संरचनाओं का एक दृश्य देखा जा सकता है जो विचार के सार को पकड़ लेता है।

उदाहरण के लिए, शब्दकोश:

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 वर्तमान में उन व्यवहारों / विधियों की पेशकश नहीं करते हैं।

[२]: नया शब्दकोश कार्यान्वयन अधिक कॉम्पैक्ट रूप से डिज़ाइन किए जाने से बेहतर मेमोरी वार करता है; यहाँ मुख्य लाभ है। गति के अनुसार, अंतर इतना कठोर नहीं है, ऐसे स्थान हैं जहां नए तानाशाही में मामूली प्रतिगमन ( की-लुकअप, उदाहरण के लिए ) हो सकते हैं, जबकि अन्य में (पुनरावृत्ति और मन में आने वाले आकार) एक प्रदर्शन को बढ़ावा देना चाहिए।

कुल मिलाकर, शब्दकोश की कार्यक्षमता, विशेष रूप से वास्तविक जीवन की स्थितियों में, कॉम्पैक्टनेस की वजह से सुधार होता है।


अद्यतन: गुइडो वैन रोसुम guaranteed कि पायथन 3.7 के रूप में सभी पायथन कार्यान्वयन में तानाशाही आदेश को संरक्षित करना चाहिए।


मैं ऊपर चर्चा में जोड़ना चाहता था लेकिन टिप्पणी करने के लिए प्रतिष्ठा नहीं है।

पायथन 3.8 अभी तक जारी नहीं किया गया है, लेकिन इसमें शब्दकोशों पर reversed() फ़ंक्शन भी शामिल होगा और OrderedDict से एक और अंतर को OrderedDict

डिक्ट और तानाशाही अब उलट () का उपयोग करके उलटा सम्मिलन क्रम में चलने योग्य हैं। (Bpo-33462 में रेमी लापेरे द्वारा योगदान दिया गया।) देखें कि अजगर 3.8 में नया क्या है

मुझे समानता ऑपरेटर या OrderedDict की अन्य विशेषताओं का कोई उल्लेख नहीं दिखता है, इसलिए वे अभी भी पूरी तरह से समान नहीं हैं।







python-3.6