सेट और डिक्ट को विभिन्न उपयोग-मामलों के लिए अनुकूलित किया गया है। एक सेट का प्राथमिक उपयोग तेजी से सदस्यता परीक्षण है, जो आदेश अज्ञेय है। Dicts के लिए, लुकअप की लागत सबसे महत्वपूर्ण ऑपरेशन है, और कुंजी मौजूद होने की अधिक संभावना है। सेट के साथ, किसी तत्व की उपस्थिति या अनुपस्थिति पहले से ज्ञात नहीं है, और इसलिए सेट कार्यान्वयन को दोनों पाया और नहीं-पाया मामले के लिए अनुकूलित करने की आवश्यकता है। साथ ही, सामान्य सेट संचालन के लिए कुछ अनुकूलन जैसे कि यूनियन और चौराहे प्रदर्शन को कम किए बिना सेट ऑर्डर को बनाए रखना मुश्किल बनाते हैं।
जबकि दोनों डेटा संरचनाएँ हैश आधारित हैं, यह एक आम गलत धारणा है जो सेट केवल शून्य मान के साथ dicts के रूप में लागू की जाती है। यहां तक कि इससे पहले कि CPython 3.6 में कॉम्पैक्ट dict कार्यान्वयन, सेट और dict कार्यान्वयन पहले से ही छोटे से कोड पुनः प्रयोग के साथ काफ़ी भिन्न है,। उदाहरण के लिए, dicts यादृच्छिक परिवीक्षा का उपयोग करते हैं, लेकिन सेट कैश स्थानीयता में सुधार करने के लिए रैखिक जांच और खुले पते के संयोजन का उपयोग करते हैं। प्रारंभिक रैखिक जांच ( CPython में डिफ़ॉल्ट 9 चरण ) आसन्न कुंजी / हैश जोड़े की एक श्रृंखला की जांच करेगा, हैश टक्कर से निपटने की लागत को कम करके प्रदर्शन में सुधार करेगा - लगातार मेमोरी एक्सेस बिखरे हुए जांच की तुलना में सस्ता है।
सीपीथॉन के सेट कार्यान्वयन को बदलने के लिए सिद्धांत में यह संभव होगा कि वह कॉम्पैक्ट तानाशाह के समान हो, लेकिन व्यवहार में कमियां हैं, और उल्लेखनीय कोर डेवलपर्स इस तरह के बदलाव के विरोध में थे।
सेट अनियंत्रित रहते हैं। (क्यों? उपयोग पैटर्न अलग हैं। इसके अलावा, अलग कार्यान्वयन।)
- गुइडो वैन रोसुम
सेट एक अलग एल्गोरिथ्म का उपयोग करते हैं जो प्रविष्टि क्रम को बनाए रखने के लिए संशोधन के रूप में नहीं है। यदि ऑर्डर की आवश्यकता हो तो सेट-टू-सेट ऑपरेशन अपना लचीलापन और अनुकूलन खो देते हैं। सेट गणित को अनियंत्रित सेट के संदर्भ में परिभाषित किया गया है। संक्षेप में, सेट ऑर्डर तत्काल भविष्य में नहीं है।
- रेमंड हेटिंगर
इस बारे में विस्तृत चर्चा कि क्या 3.7 के लिए सेट को संक्षिप्त करना है, और इसके बारे में जवाब क्यों दिया गया कि इसके खिलाफ फैसला किया गया था, अजगर-देव मेलिंग सूचियों में पाया जा सकता है।
सारांश में, मुख्य बिंदु यह हैं कि उपयोग के पैटर्न अलग-अलग हैं (सम्मिलन आदेश डिकट्स जैसे ** kwargs उपयोगी है , सेट के लिए कम है), कॉम्पैक्टिंग सेट के लिए अंतरिक्ष की बचत कम महत्वपूर्ण है (क्योंकि केवल कुंजी और हैश सरणी हैं घनीभूत, कुंजियों, हैश और मूल्यों के विपरीत), और सेट में उक्त रैखिक परिवीक्षा अनुकूलन एक कॉम्पैक्ट कार्यान्वयन के साथ असंगत है।
मैं नीचे रेमंड के पद को पुन: पेश करूंगा जिसमें सबसे महत्वपूर्ण बिंदु शामिल हैं।
14 सितंबर, 2016 को 3:50 बजे, एरिक स्नो ने लिखा:
फिर, मैं सेट्स के लिए भी ऐसा ही करूंगा।
जब तक मैंने गलत नहीं समझा, रेमंड सेट करने के लिए समान परिवर्तन करने का विरोध कर रहा था।
ये सही है। इस विषय पर कुछ विचार इस प्रकार हैं कि लोग जंगली दौड़ना शुरू करते हैं।
कॉम्पैक्ट तानाशाह के लिए, अंतरिक्ष की बचत सूचकांकों द्वारा खपत अतिरिक्त स्थान के साथ एक शुद्ध जीत थी और कुंजी / मूल्य / हैश सरणियों के बेहतर घनत्व द्वारा ऑफसेट से अधिक होने के लिए कुंजी / मूल्य / हैश सरणियों के लिए समग्र रूप से। हालाँकि सेट्स के लिए, नेट बहुत कम अनुकूल था क्योंकि हमें अभी भी सूचकांकों और समग्रता की आवश्यकता है लेकिन केवल तीन सरणियों में से केवल दो को कम करके अंतरिक्ष लागत को ऑफसेट कर सकते हैं। दूसरे शब्दों में, जब आप कुंजियों, मूल्यों और हैश के लिए जगह बर्बाद कर लेते हैं, तो कॉम्पैक्टिंग अधिक मायने रखती है। यदि आप उन तीनों में से एक को खो देते हैं, तो यह सम्मोहक होना बंद हो जाता है।
सेट के लिए उपयोग पैटर्न dicts से अलग है। पूर्व में अधिक हिट या मिस लुकअप हैं। उत्तरार्द्ध कम लापता कुंजी लुकअप है। इसके अलावा, सेट-टू-सेट संचालन के लिए कुछ अनुकूलन प्रदर्शन को प्रभावित किए बिना सेट ऑर्डर को बनाए रखना मुश्किल बनाते हैं।
मैंने सेट प्रदर्शन को बेहतर बनाने के लिए वैकल्पिक रास्ता अपनाया। कॉम्पैक्ट करने के बजाय (जो कि अधिक स्थान की जीत नहीं थी और एक अतिरिक्त अप्रत्यक्ष लागत की वजह से), मैंने टकराव की लागत को कम करने और कैश प्रदर्शन में सुधार करने के लिए रैखिक जांच को जोड़ा। यह सुधार शब्दकोशों के लिए वकालत करने वाले दृष्टिकोण के साथ असंगत है।
अभी के लिए, शब्दकोशों पर आदेश देने वाला साइड-इफ़ेक्ट नॉन-गारंटीकृत है, इसलिए सेट को जोर देने के साथ-साथ ऑर्डर करना भी शुरू करना समय से पहले है। डॉक्स पहले से ही ऑर्डरडसेट ( https://code.activestate.com/recipes/576694/ ) बनाने के लिए एक रेसिपी से लिंक
करता है, लेकिन ऐसा लगता है कि अपटेक लगभग शून्य हो गया है। इसके अलावा, अब जब एरिक स्नो ने हमें एक फास्ट ऑर्डरेड डिक्टेड दिया है, तो मुटेबलसेट और ऑर्डरडीडिक्ट से ऑर्डरडसेट का निर्माण करना पहले से कहीं अधिक आसान है, लेकिन फिर से मैंने कोई वास्तविक रुचि नहीं दिखाई है क्योंकि विशिष्ट सेट-टू-सेट डेटा एनालिटिक्स वास्तव में नहीं है आदेश देने के बारे में जरूरत या देखभाल। इसी तरह, तेजी से सदस्यता परीक्षण का प्राथमिक उपयोग आदेश अज्ञेय है।
मैंने कहा, मुझे लगता है कि PyPI में वैकल्पिक सेट कार्यान्वयन को जोड़ने के लिए जगह है। विशेष रूप से, ऑर्डर करने योग्य डेटा के लिए कुछ दिलचस्प विशेष मामले हैं जहां सेट-टू-सेट ऑपरेशन को चाबियों की पूरी श्रृंखला की तुलना करके स्पेड-अप किया जा सकता है (देखें
https://code.activestate.com/recipes/230113-implementation-of-
एक प्रारंभिक बिंदु के लिए सेट-उपयोग-सॉर्ट किए गए-सूची )। IIRC, PyPI में पहले से ही सेट-जैसे ब्लूम फ़िल्टर और कोयल हैशिंग के लिए कोड है।
मैं समझता हूं कि पायथन कोर में स्वीकार किए गए कोड का एक प्रमुख ब्लॉक होना रोमांचक है, लेकिन जब तक कि यह सुनिश्चित नहीं हो जाता है कि हम अन्य डेटाटाइप्स के अधिक प्रमुख रिट्वीट्स में उलझाने के लिए फ्लगगेट्स को नहीं खोल सकते हैं।
- रेमंड हेटिंगर
से [अजगर-देव] अजगर 3.6 dict कॉम्पैक्ट हो जाता है और एक निजी संस्करण हो जाता है; और कीवर्ड ऑर्डर हो गए हैं , सितंबर 2016