नहीं, पीईपी 412 __slots__
अनावश्यक बनाते हैं।
पहला, आर्मीन रिगो सही है कि आप इसे ठीक से माप नहीं रहे हैं। आपको मापने की आवश्यकता है वस्तु का आकार, साथ ही मूल्य, साथ ही __dict__
स्वयं (केवल NoSlots
के लिए) और कुंजी (केवल NoSlots
के लिए)।
या आप वह क्या पता चलता है कर सकता है:
cls = Slots if len(sys.argv) > 1 else NoSlots
def f():
tracemalloc.start()
objs = [cls() for _ in range(100000)]
print(tracemalloc.get_traced_memory())
f()
जब मैं ओएस एक्स पर 64-बिट पर इस चलाने CPython 3.4, मैं 8824968
NoSlots
और 25624872
Slots
के लिए के लिए मिलता है। तो, ऐसा लगता है कि NoSlots
उदाहरण 88 बाइट्स लेता है, जबकि Slots
उदाहरण 256 बाइट्स लेता है।
यह कैसे संभव है?
क्योंकि __slots__
और एक कुंजी-विभाजन __dict__
के बीच अभी भी दो अंतर हैं।
सबसे पहले, शब्दकोशों द्वारा उपयोग की गई हैश टेबल 2/3s से नीचे रखी जाती हैं, और वे तेजी से बढ़ती हैं और न्यूनतम आकार होती है, इसलिए आपके पास कुछ अतिरिक्त जगह होगी। और source पर अच्छी तरह से टिप्पणी करके देखकर कितना स्थान बनाना मुश्किल नहीं है: आपके पास 5 स्लॉट पॉइंटर्स की बजाय 8 हैश बाल्टी होगी।
दूसरा, शब्दकोश स्वयं ही मुफ़्त नहीं है; इसमें मानक ऑब्जेक्ट हेडर, एक गिनती और दो पॉइंटर्स हैं।यह बहुत कुछ नहीं लग सकता है, लेकिन जब आप किसी ऑब्जेक्ट के बारे में बात कर रहे हैं जिसमें केवल कुछ विशेषताओं को प्राप्त किया गया है (ध्यान दें कि अधिकतर ऑब्जेक्ट्स में केवल कुछ विशेषताएं हैं ...), हैडर हेडर हैश टेबल के रूप में बहुत अंतर कर सकता है ।
और निश्चित रूप से आपके उदाहरण में, मूल्य, इसलिए यहां शामिल एकमात्र लागत वस्तु है, साथ ही 5 स्लॉट या 8 हैश बाल्टी और टोक़ हेडर, इसलिए अंतर बहुत नाटकीय है। वास्तविक जीवन में, __slots__
शायद ही कभी होगा अधिक लाभ।
अंत में, सूचना है कि पीईपी 412 केवल दावा है:
बेंचमार्किंग पता चलता है कि स्मृति उपयोग वस्तु उन्मुख कार्यक्रमों
जहां के बारे में सोचो के लिए 20% तक 10% से कम हो जाता है __slots__
का उपयोग करें। या तो बचत इतनी बड़ी है कि __slots__
का उपयोग नहीं करना हास्यास्पद होगा, या आपको वास्तव में पिछले 15% को निचोड़ने की आवश्यकता है। या आप एक एबीसी या अन्य कक्षा का निर्माण कर रहे हैं जिसे आप कहां से जानते हैं कि सब-क्लास को बचत की आवश्यकता हो सकती है। किसी भी दर पर, उन मामलों में, तथ्य यह है कि आपको __slots__
, या लाभ के दो तिहाई लाभ के बिना आधा लाभ मिलता है, अभी भी शायद ही कभी पर्याप्त होगा; आपको अभी भी __slots__
का उपयोग करने की आवश्यकता होगी।
वास्तविक जीत उन मामलों में है जहां __slots__
का उपयोग करने योग्य नहीं है; आपको मुफ्त में एक छोटा सा लाभ मिलेगा।
(इसके अलावा, निश्चित रूप से कुछ प्रोग्रामर हैं जो __slots__
से बाहर नरक का उपयोग करते हैं, और हो सकता है कि यह परिवर्तन उनमें से कुछ को कुछ ऊर्जा को अनुकूलित करने के लिए कुछ अन्य लोगों को अनुकूलित कर सके, यदि आप भाग्यशाली हैं, तो अप्रासंगिक नहीं है।)
क्या आपने अभी तक वास्तविक दुनिया की स्थितियों में अंतर को माप लिया है? :-) इसके अलावा, '__slots__' (एबी) इसके दुष्प्रभावों के लिए उपयोग किया जा सकता है, जैसे तथ्य यह है कि यह मनमाने ढंग से गुणों को जोड़ा जा रहा है। –
हां, मैं __slots__ के साथ समस्या से अवगत हूं, यह एक विशिष्ट उपयोग मामले से संबंधित एक अकादमिक प्रश्न था। मैंने कुछ परीक्षण चलाने की कोशिश की, लेकिन पाइथन 3.3 या 2.7 में स्लॉट्स का उपयोग करने के बीच कोई अंतर नहीं मिला। लेकिन शायद मेरा परीक्षण दोषपूर्ण है, इसलिए मैं इसे भी पोस्ट करूंगा। – aquavitae