python如何在循環(huán)引用中管理內(nèi)存
python中通過(guò)引用計(jì)數(shù)來(lái)回收垃圾對(duì)象,在某些環(huán)形數(shù)據(jù)結(jié)構(gòu)(樹(shù),圖……),存在對(duì)象間的循環(huán)引用,比如樹(shù)的父節(jié)點(diǎn)引用子節(jié)點(diǎn),子節(jié)點(diǎn)同時(shí)引用父節(jié)點(diǎn),此時(shí)通過(guò)del掉引用父子節(jié)點(diǎn),兩個(gè)對(duì)象不能被立即釋放
需求:
如何解決此類(lèi)的內(nèi)存管理問(wèn)題?
如何查詢(xún)一個(gè)對(duì)象的引用計(jì)數(shù)?
import sys
sys.getrefcount(obj)
# 查詢(xún)引用計(jì)數(shù)必多 1 ,因?yàn)閛bject也引用 查詢(xún)對(duì)象
如何解決內(nèi)存管理問(wèn)題?
- 通過(guò)weakref,進(jìn)行弱引用,當(dāng)del時(shí)候,不再引用,在引用方添加weakref.ref(引用obj);
- 使用引用的時(shí)候,需要用到函數(shù)調(diào)用的形式
#!/usr/bin/python3 import weakref import sys class Data(object): def __init__(self, value, owner): self.value = value # 聲明弱引用,owner為Node類(lèi)本身 self.owner = weakref.ref(owner) # 通過(guò)函數(shù)調(diào)用的方式訪問(wèn)引用對(duì)象 def __str__(self): return "%s's data, value is %s" % (self.owner(), self.value) def __del__(self): print('in_data.__del__') class Node(object): def __init__(self, value): # 把類(lèi)本身,也當(dāng)做參數(shù)傳入Data類(lèi)中 self.data = Data(value, self) # 自定義對(duì)象名,容易辨認(rèn) def __str__(self): return 'Node' def __del__(self): print('in_node.__del__') if __name__ == '__main__': node = Node(100) print(node.data) # 打印node對(duì)象的引用計(jì)數(shù) print(sys.getrefcount(node) - 1) # 當(dāng)刪除node對(duì)象時(shí)候,Data實(shí)例對(duì)象在引用計(jì)算為0也相應(yīng)釋放 del node input('del done >>>>>')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用xlrd模塊操作Excel數(shù)據(jù)導(dǎo)入的方法
這篇文章主要介紹了Python使用xlrd模塊操作Excel數(shù)據(jù)導(dǎo)入的方法,涉及Python操作xlrd模塊的技巧,需要的朋友可以參考下2015-05-05Pyramid Mako模板引入helper對(duì)象的步驟方法
ylons中的mako模板,默認(rèn)會(huì)引入一個(gè)helper對(duì)象,我們可以在里面擴(kuò)展方法,應(yīng)對(duì)在模板輸出時(shí)候會(huì)常用的操作,那么在Pyramid中如何默認(rèn)引入同樣的輔助類(lèi)到模板中2013-11-11在Python中使用MySQL--PyMySQL的基本使用方法
PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務(wù)器的一個(gè)庫(kù),Python2中則使用mysqldb。這篇文章主要介紹了在Python中使用MySQL--PyMySQL的基本使用,需要的朋友可以參考下2019-11-11Django項(xiàng)目創(chuàng)建到啟動(dòng)詳解(最全最詳細(xì))
這篇文章主要給大家介紹了關(guān)于Django項(xiàng)目創(chuàng)建到啟動(dòng)的步驟,本文介紹的方法算是最全最詳細(xì)的一個(gè)項(xiàng)目,需要的朋友可以參考下2019-09-09pytorch多GPU并行運(yùn)算的實(shí)現(xiàn)
這篇文章主要介紹了pytorch多GPU并行運(yùn)算的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python存儲(chǔ)json數(shù)據(jù)發(fā)生亂碼的解決方法
當(dāng)使用json.dump()把python對(duì)象轉(zhuǎn)換為json后存儲(chǔ)到文件中時(shí),文件可能會(huì)出現(xiàn)亂碼的問(wèn)題,本篇文章可以幫助您解決亂碼問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Python使用Tesseract實(shí)現(xiàn)從圖像中讀取文本
Tesseract?是一個(gè)基于計(jì)算機(jī)的系統(tǒng),用于光學(xué)字符識(shí)別?(OCR)?和其他圖像到文本處理,本文將介紹如何使用?Python?中的?Tesseract?創(chuàng)建一個(gè)可以從圖像中讀取文本的程序,需要的可以參考下2023-11-11