software - python tutorial
क्या मुझे पायथन में परिपत्र संदर्भों के बारे में चिंता करनी चाहिए? (4)
एक चर में सूचियों में तरीकों के संदर्भ के साथ एक मुद्दा प्रतीत होता है। यहाँ दो उदाहरण हैं। पहले वाले को __del__
नहीं कहते हैं। कमजोर वर्ग वाला दूसरा व्यक्ति __del__ के लिए ठीक है। हालाँकि, इस मामले में बाद में समस्या यह है कि आप संदर्भ विधियों को कमजोर नहीं कर सकते हैं: http://docs.python.org/2/library/weakref.html
import sys, weakref
class One():
def __init__(self):
self.counters = [ self.count ]
def __del__(self):
print("__del__ called")
def count(self):
print(sys.getrefcount(self))
sys.getrefcount(One)
one = One()
sys.getrefcount(One)
del one
sys.getrefcount(One)
class Two():
def __init__(self):
self.counters = [ weakref.ref(self.count) ]
def __del__(self):
print("__del__ called")
def count(self):
print(sys.getrefcount(self))
sys.getrefcount(Two)
two = Two()
sys.getrefcount(Two)
del two
sys.getrefcount(Two)
मान लीजिए मेरे पास एक कोड है जो एक माता-पिता / बच्चों की संरचना को बनाए रखता है। ऐसी संरचना में मुझे परिपत्र संदर्भ मिलते हैं, जहां एक बच्चा एक माता-पिता को इंगित करता है और एक माता-पिता एक बच्चे को इंगित करता है। क्या मुझे उनकी चिंता करनी चाहिए? मैं पायथन 2.5 का उपयोग कर रहा हूं।
मुझे चिंता है कि वे कचरा एकत्र नहीं किया जाएगा और आवेदन अंततः सभी मेमोरी का उपभोग करेगा।
परिपत्र संदर्भ एक सामान्य बात है, इसलिए मुझे उनके बारे में चिंतित होने का कोई कारण नहीं दिखता है। कई पेड़ एल्गोरिदम के लिए आवश्यक है कि प्रत्येक नोड के अपने बच्चों और उसके माता-पिता से संबंध हों। वे भी एक डबल जुड़े सूची की तरह कुछ को लागू करने के लिए आवश्यक हैं।
प्रायोगिक तौर पर: आप ठीक हैं:
import itertools
for i in itertools.count():
a = {}
b = {"a":a}
a["b"] = b
यह लगातार 3.6 एमबी रैम का उपयोग करता है।
मुझे नहीं लगता कि आपको चिंता करनी चाहिए। निम्नलिखित कार्यक्रम का प्रयास करें और आप देखेंगे कि यह सभी मेमोरी का उपभोग नहीं करेगा:
while True:
a=range(100)
b=range(100)
a.append(b)
b.append(a)
a.append(a)
b.append(b)