__slots__ और मेमोरी अनुकूलन
प्रत्येक इंस्टेंस की अतिरिक्त मेमोरी घटाने के लिए __slots__ का उपयोग करें।
__slots__ और मेमोरी अनुकूलन, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
डिफ़ॉल्ट __dict__ का अतिरिक्त भार
डिफ़ॉल्ट रूप से, पाइथन का प्रत्येक इंस्टेंस एट्रिब्यूट को __dict__ डिक्शनरी में संग्रहीत करता है, जिससे मेमोरी का काफ़ी अतिरिक्त उपयोग होता है—आमतौर पर प्रत्येक इंस्टेंस के लिए 200–400 बाइट।
import sys
class Point:
def __init__(self, x, y): self.x, self.y = x, y
p = Point(1, 2)
print(sys.getsizeof(p.__dict__)) # ~200 bytes__slots__ घोषित करना
एट्रिब्यूट के नामों के अनुक्रम के रूप में __slots__ परिभाषित करें। पाइथन डिक्शनरी के बजाय निश्चित आकार की सारणी आवंटित करता है, जिससे मेमोरी बचती है।
class SlottedPoint:
__slots__ = ("x", "y")
def __init__(self, x, y):
self.x = x
self.y = y
p = SlottedPoint(1, 2)
print(p.x, p.y) # 1 2
# p.z = 3 # AttributeError: no __dict__मेमोरी की बचत
__slots__ के साथ, डिक्शनरी-आधारित इंस्टेंस की तुलना में प्रत्येक इंस्टेंस आमतौर पर 30–50% मेमोरी बचाता है—लाखों ऑब्जेक्ट बनाने पर यह बचत महत्वपूर्ण होती है।
import sys
class Reg:
def __init__(self, x, y): self.x, self.y = x, y
class Slotted:
__slots__ = ("x","y")
def __init__(self, x, y): self.x, self.y = x, y
print(sys.getsizeof(Reg(1,2))) # ~56 bytes + ~200 dict
print(sys.getsizeof(Slotted(1,2))) # ~56 bytes (no dict)डिफ़ॉल्ट रूप से __dict__ नहीं
स्लॉट वाली क्लास में __dict__ नहीं होता, इसलिए निर्माण के बाद आप मनमाने एट्रिब्यूट नहीं जोड़ सकते।
class Config:
__slots__ = ("host", "port")
def __init__(self, h, p): self.host, self.port = h, p
c = Config("localhost", 8080)
# c.debug = True # AttributeError
print(hasattr(c, "__dict__")) # False__slots__ के साथ __dict__ बनाए रखना
प्रति-इंस्टेंस डिक्शनरी बनाए रखने के लिए "__dict__" को __slots__ में शामिल करें; इससे सामान्य एट्रिब्यूट को स्लॉट के रूप में पहले से घोषित करना भी संभव रहता है।
class Hybrid:
__slots__ = ("x", "__dict__")
def __init__(self, x):
self.x = x
h = Hybrid(1)
h.extra = "dynamic" # allowed
print(h.extra)__slots__ में __weakref__
स्लॉट वाली क्लास में कमज़ोर-संदर्भ का समर्थन समाप्त हो जाता है। इसे फिर से सक्षम करने के लिए "__weakref__" को __slots__ में जोड़ें।
import weakref
class Node:
__slots__ = ("value", "__weakref__")
def __init__(self, v): self.value = v
n = Node(42)
ref = weakref.ref(n)
print(ref()) # <Node object>विरासत और __slots__
यदि पैरंट क्लास __slots__ का उपयोग नहीं करती, तो चाइल्ड को फिर भी __dict__ मिलता है। पूरी बचत के लिए पूरे पदानुक्रम में __slots__ परिभाषित करना आवश्यक है।
class Base:
__slots__ = ("x",)
class Child(Base):
__slots__ = ("y",) # no __dict__
class WithoutSlots(Base):
pass # gets __dict__ from objectमेमोरी का बेंचमार्क करना
tracemalloc या pympler का उपयोग करके __slots__ जोड़ने से पहले और बाद में वास्तविक मेमोरी उपयोग मापें।
import tracemalloc
tracemalloc.start()
points = [SlottedPoint(i, i) for i in range(100_000)]
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Peak: {peak/1024/1024:.1f} MB")__slots__ और पिकलिंग
यदि आप __getstate__ और __setstate__ परिभाषित करते हैं, तो स्लॉट वाले ऑब्जेक्ट का पिकलिंग किया जा सकता है। इसके अलावा, पाइथन 3 से डिफ़ॉल्ट पिकल प्रोटोकॉल स्लॉट को अपने-आप संभालता है।
import pickle
class Point:
__slots__ = ("x", "y")
def __init__(self, x, y): self.x, self.y = x, y
p = Point(3, 4)
data = pickle.dumps(p)
p2 = pickle.loads(data)
print(p2.x, p2.y) # 3 4__slots__ वाले डेटाक्लास — पाइथन 3.10+
@dataclass को slots=True दें, ताकि __slots__ अपने-आप बनाया जा सके।
from dataclasses import dataclass
@dataclass(slots=True)
class Vector:
x: float
y: float
v = Vector(1.0, 2.0)
print(v.x, v.y) # 1.0 2.0
print(hasattr(v, "__dict__")) # False__slots__ का उपयोग कब करें
__slots__ का उपयोग तब करें जब: आप लाखों इंस्टेंस बना रहे हों, मेमोरी सीमित हो, या एट्रिब्यूट एक्सेस की गति अत्यंत महत्वपूर्ण हो। सामान्य-उद्देश्य वाली क्लास के लिए, जहाँ लचीलापन अधिक महत्वपूर्ण है, इसका उपयोग न करें।
# Good candidates:
# - Nodes in a large graph or tree
# - Records in a large dataset
# - High-frequency event objects
# Bad candidates:
# - Configuration objects added to ad-hoc
# - Classes that mix-in dynamic attributesत्वरित जाँच
स्लॉट वाले इंस्टेंस पर __slots__ में सूचीबद्ध न किए गए एट्रिब्यूट को सेट करने का प्रयास करने पर क्या होता है?
पुनरावलोकन
__slots__ प्रति-इंस्टेंस __dict__ को निश्चित सारणी से बदलता है, जिससे 30–50% मेमोरी बचती है। यदि आपको इनकी आवश्यकता हो, तो "__dict__" या "__weakref__" शामिल करें। पूरी बचत के लिए पूरी विरासत शृंखला में __slots__ का उपयोग होना चाहिए। पाइथन 3.10+ में @dataclass(slots=True) का उपयोग करें।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 76
- पाठ
- 320
अक्सर पूछे जाने वाले प्रश्न
क्या “__slots__ और मेमोरी अनुकूलन” पाठ निःशुल्क है?
हाँ—“__slots__ और मेमोरी अनुकूलन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“__slots__ और मेमोरी अनुकूलन” में मैं क्या सीखूँगा?
प्रत्येक इंस्टेंस की अतिरिक्त मेमोरी घटाने के लिए __slots__ का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“__slots__ और मेमोरी अनुकूलन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Python क्लास कैसे बनाई जाती हैं
- कस्टम मेटाक्लास लिखना
- डिस्क्रिप्टर: __get__, __set__, __delete__
- __slots__ और मेमोरी अनुकूलन