"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > पायथन कक्षाओं में बेहतर प्रदर्शन के लिए __slots__ का लाभ उठाना

पायथन कक्षाओं में बेहतर प्रदर्शन के लिए __slots__ का लाभ उठाना

2024-11-12 को प्रकाशित
ब्राउज़ करें:362

हर बार जब हम एक नया वर्ग बनाते हैं तो पायथन हर विशेषता को एक dict विशेषता में संग्रहीत करता है जिसे डायनामिक डिक्शनरी कहा जाता है। यह डिफ़ॉल्ट व्यवहार सुविधाजनक प्रतीत होता है, क्योंकि यह लचीला है, लेकिन जब आप बड़ी संख्या में उदाहरणों या मेमोरी उपयोग के मामलों के साथ काम कर रहे हैं तो यह ओवरहेड महत्वपूर्ण हो सकता है।

Leveraging __slots__ for Better Performance in Python Classes

'स्लॉट' कैसे काम करते हैं?

पायथन मूल रूप से वर्ग विशेषताओं को संग्रहीत करने के लिए एक शब्दकोश का उपयोग करता है, लेकिन विकल्पों में से एक slots का उपयोग करना है। इस नाम को परिभाषित करके, हम पायथन को अधिक स्थिर और कॉम्पैक्ट संरचना का उपयोग करने के लिए कह रहे हैं जो मेमोरी उपयोग को काफी कम कर देता है। किसी कक्षा में स्लॉट का उपयोग कैसे करें इसका एक बुनियादी उदाहरण यहां दिया गया है।

import sys 

class WithoutSlots:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class WithSlots:
    __slots__ = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y

obj1 = WithoutSlots(1, 2)
obj2 = WithSlots(1, 2)

print(sys.getsizeof(obj1.__dict__)) # 296
print(sys.getsizeof(obj2)) # 48

जैसा कि ऊपर दिखाया गया है 'विदस्लॉट्स' की तुलना में 'विदाउटस्लॉट्स' बहुत अधिक मेमोरी का उपयोग करता है। कक्षा के कई उदाहरण बनाने के बारे में सोचें - कौन सा दृष्टिकोण बेहतर विकल्प होगा?

Leveraging __slots__ for Better Performance in Python Classes

सीमाएँ

slots उपयोगी उपकरण हो सकता है, लेकिन सीमाओं के साथ आता है:

  • कोई गतिशील विशेषता नहीं: क्लास बॉडी में slots को परिभाषित करते समय हम इसकी डिफ़ॉल्ट विशेषता को अक्षम कर देते हैं (dict), इसलिए हम उदाहरण के निर्माण के बाद उसमें गतिशील रूप से नई विशेषताएँ नहीं जोड़ सकते।
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

हम dict को स्लॉट में जोड़कर इससे निजात पा सकते हैं।

  • कोई एकाधिक वंशानुक्रम नहीं: प्रत्येक बेस क्लास में slots परिभाषित होना चाहिए, अन्यथा पायथन इंस्टेंस विशेषताओं को संग्रहीत करने के लिए शब्दकोश का उपयोग करने पर वापस लौट आएगा।

  • कोई डिफ़ॉल्ट मान नहीं: आपको init विधि में स्पष्ट रूप से डिफ़ॉल्ट मान प्रारंभ करने की आवश्यकता है।

Leveraging __slots__ for Better Performance in Python Classes

इसका उपयोग कब करना है

मैंने कुछ बेहतरीन परिदृश्य उदाहरण लिखे हैं जहां हम स्लॉट का उपयोग कर सकते हैं:

  • जब हमारे पास बनाने के लिए बहुत सारे उदाहरण हैं और मेमोरी का उपयोग एक चिंता का विषय है।
  • जब हमें प्रदर्शन को अनुकूलित करने की आवश्यकता होती है।
  • जब आपके पास ऐसे गुण हों जो ज्ञात और निश्चित हों।
  • जब आप बड़े डेटासेट के साथ काम करते हैं।

Leveraging __slots__ for Better Performance in Python Classes

अंतिम विचार

पायथन में इस प्रकार slots का उपयोग किया जाता है: आप उनका उपयोग तब कर सकते हैं जब आप आश्वस्त हों कि आपको अपनी कक्षा के लिए किसी अन्य विशेषता की आवश्यकता नहीं होगी और आप इसके साथ काम कर रहे हैं उदाहरणों की एक बड़ी संख्या. slots को परिभाषित करके, आप पायथन को विशेषताओं को संग्रहीत करने के लिए एक अधिक कुशल और कॉम्पैक्ट संरचना का उपयोग करने के लिए कहते हैं, जो मेमोरी को बचाने में मदद करता है। यह विशेष रूप से तब उपयोगी होता है जब मेमोरी उपयोग चिंता का विषय हो या जब आपको प्रदर्शन को अनुकूलित करने की आवश्यकता हो। बस याद रखें कि slots के साथ, आप गतिशील रूप से नई विशेषताएँ नहीं जोड़ सकते हैं, इसलिए इसका सबसे अच्छा उपयोग तब किया जाता है जब आपकी कक्षा विशेषताएँ निश्चित और अच्छी तरह से परिभाषित हों।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/conradylx/levereasing-slots-for-better-performance-in-python-classes-2ol4?1 यदि कोई उल्लंघन है, तो कृपया हटाने के लिए स्टडी_गोलंग@163.com पर संपर्क करें। यह
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3