CPython रेफ़रेंस काउंटिंग
समझें कि CPython रेफ़रेंस काउंट से ऑब्जेक्ट के जीवनकाल पर नज़र कैसे रखता है।
CPython रेफ़रेंस काउंटिंग, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
संदर्भ संख्या क्या है?
CPython हर ऑब्जेक्ट की संदर्भ संख्या का हिसाब रखता है। संख्या 0 होने पर ऑब्जेक्ट तुरंत डीलोकेट हो जाता है। यही Python की प्राथमिक मेमोरी प्रबंधन प्रणाली है।
import sys
x = [1, 2, 3]
print(sys.getrefcount(x)) # 2 (x + getrefcount arg)
y = x
print(sys.getrefcount(x)) # 3sys.getrefcount()
sys.getrefcount(obj) वर्तमान संदर्भ संख्या लौटाता है। ध्यान दें: इसे कॉल करने पर 1 जुड़ जाता है (फ़ंक्शन आर्ग्युमेंट का संदर्भ)।
import sys
a = "hello"
print(sys.getrefcount(a)) # baseline (may be high for interned strings)
b = a
print(sys.getrefcount(a)) # one more
del b
print(sys.getrefcount(a)) # back to baselineबढ़ाना और घटाना
हर असाइनमेंट संख्या बढ़ाता है; हर डिलीशन या पुनःअसाइनमेंट इसे घटाता है। संख्या 0 पर पहुँचने पर CPython ऑब्जेक्ट के डीलोकेटर को कॉल करता है।
x = [] # refcount = 1
y = x # refcount = 2
z = [x] # refcount = 3 (list holds a reference)
del y # refcount = 2
z.clear() # refcount = 1
del x # refcount = 0 → deallocatedऑब्जेक्ट इंटरनिंग
CPython छोटी पूर्णांक संख्याओं (-5 से 256 तक) और कई स्ट्रिंग लिटरल को इंटरन करता है तथा उसी ऑब्जेक्ट का पुनः उपयोग करता है। is तुलनाएँ इसे दिखाती हैं।
a = 256
b = 256
print(a is b) # True (interned)
c = 257
d = 257
print(c is d) # may be False (not interned)कमज़ोर संदर्भ
कमज़ोर संदर्भ संदर्भ संख्या नहीं बढ़ाते। ये उन ऑब्जेक्ट को कचरा संग्रहण से रोकने से बचने के लिए उपयोगी हैं, जिन्हें आप देखना चाहते हैं लेकिन जिनके स्वामी नहीं बनना चाहते।
import weakref
class BigObject:
pass
obj = BigObject()
ref = weakref.ref(obj)
print(ref()) # <BigObject instance>
del obj
print(ref()) # None (object was collected)संदर्भ चक्र
यदि A का संदर्भ B से और B का संदर्भ A से है, तो दोनों के पहुँच से बाहर होने पर भी किसी की संख्या 0 नहीं होती। CPython का चक्रीय GC इनका पता लगाकर इन्हें संग्रहित करता है।
a = []
b = [a]
a.append(b) # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects themgc मॉड्यूल
gc मॉड्यूल चक्रीय कचरा संग्राहक उपलब्ध कराता है। यह स्वचालित रूप से चलता है, लेकिन इसे मैन्युअल रूप से चलाया या अक्षम किया जा सकता है।
import gc
gc.collect() # force a collection cycle
print(gc.get_count()) # (gen0, gen1, gen2) allocation counts
print(gc.get_threshold()) # when each generation is collectedमेमोरी पूल (pymalloc)
CPython छोटे ऑब्जेक्ट (512 बाइट से कम) अपने मेमोरी पूल (pymalloc) से आवंटित करता है, जो हर छोटे ऑब्जेक्ट के लिए malloc कॉल करने से अधिक तेज़ है।
# You do not call pymalloc directly — CPython uses it internally
# for all Python-level object allocations
# The pool pre-allocates large memory arenas
# and carves them into pools of fixed-size blocks__del__ फ़ाइनलाइज़र
जब किसी ऑब्जेक्ट की संदर्भ संख्या 0 हो जाती है (या चक्र में होने पर बाद में), तब __del__ कॉल किया जाता है। महत्वपूर्ण सफ़ाई के लिए इस पर निर्भर न रहें—इसके बजाय कॉन्टेक्स्ट मैनेजर का उपयोग करें।
class Resource:
def __del__(self):
print(f"Freeing {self}")
# Better: use context manager
class SafeResource:
def __enter__(self): return self
def __exit__(self, *a): self.cleanup()__slots__ वाले कॉम्पैक्ट ऑब्जेक्ट
__slots__ वाले ऑब्जेक्ट कम मेमोरी और कम आवंटन का उपयोग करते हैं, जिससे GC पर दबाव घटता है।
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))) # ~48 + dict overhead
print(sys.getsizeof(Slotted(1,2))) # ~48 (no dict)चक्रीय GC अक्षम करना
जिन प्रोग्राम में संदर्भ चक्र नहीं बनते, उनमें चक्रीय GC अक्षम करने से थ्रूपुट बेहतर हो सकता है।
import gc
gc.disable() # no cyclic GC — objects are only freed by refcounting
# Use only if you KNOW no cycles are created
# (pure functional/immutable data)
gc.enable() # re-enableत्वरित जाँच
CPython किसी ऑब्जेक्ट को तुरंत डीलोकेट कब करता है?
पुनरावलोकन
CPython ऑब्जेक्ट का प्रबंधन संदर्भ संख्याओं के माध्यम से करता है। संख्या 0 होने पर → तुरंत डीलोकेशन। संदर्भ चक्रों को चक्रीय GC (gc मॉड्यूल) संभालता है। महत्वपूर्ण सफ़ाई के लिए __del__ से बचें; कॉन्टेक्स्ट मैनेजर का उपयोग करें। प्रति-ऑब्जेक्ट मेमोरी घटाने के लिए __slots__ का उपयोग करें।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 76
- पाठ
- 320
अक्सर पूछे जाने वाले प्रश्न
क्या “CPython रेफ़रेंस काउंटिंग” पाठ निःशुल्क है?
हाँ—“CPython रेफ़रेंस काउंटिंग” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“CPython रेफ़रेंस काउंटिंग” में मैं क्या सीखूँगा?
समझें कि CPython रेफ़रेंस काउंट से ऑब्जेक्ट के जीवनकाल पर नज़र कैसे रखता है। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“CPython रेफ़रेंस काउंटिंग” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- CPython रेफ़रेंस काउंटिंग
- गार्बेज कलेक्टर और चक्रीय रेफ़रेंस
- cProfile और line_profiler से प्रोफ़ाइलिंग
- tracemalloc से मेमोरी प्रोफ़ाइलिंग