麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Python垃圾回收

Python垃圾回收

來源:千鋒教育
發布人:xqq
時間: 2023-11-07 01:05:07 1699290307

Python垃圾回收包括引用計數、標記清除和分代回收

引用計數

引用計數是一種垃圾收集機制,當一個python對象被引用時,引用計數加1,當一個對象的引用為0時,該對象會被當做垃圾回收。

fromsysimportgetrefcount

l1=[1,2,3]

print(getrefcount(l1))#查看引用計數

l2=l1

print(getrefcount(l2))

執行結果:

2

3

在使用getrefcount()的時候,變量作為參數傳進去,會多一次引用。

del語句會刪除對象的一個引用。請看下面的例子:

fromsysimportgetrefcount

classTestObjectA():

def__init__(self):

print("hello!!!")

def__del__(self):

print("bye!!!")

a=TestObjectA()

b=a

c=a

print(getrefcount(c))

dela

print(getrefcount(c))

delb

print(getrefcount(c))

delc

print("666")

執行結果:

hello!!!

4

3

2

bye!!!

666

方法__del__的作用是當對象被銷毀時調用。其中dela刪除了變量a,但是對象TestObjectA仍然存在,它還被b和c引用,所以不會被回收,引用計數為0時會被回收。上面的例子中,將a,b,c都刪除后引用的對象被回收(打印“666”之前)。

另外重新賦值也會刪除對象的一個引用。

標記清除

如果出現了循環引用,引用計數方法就無法回收,導致內存泄漏。先來看下面的例子:

classTestObjectA(dict):

def__init__(self):

print("A:hello!!!")

def__del__(self):

print("A:bye!!!")

classTestObjectB(dict):

def__init__(self):

print("B:hello!!!")

def__del__(self):

print("B:bye!!!")

a=TestObjectA()

b=TestObjectB()

a['1']=b

b['1']=a

dela

delb

print("666")

執行結果:

A:hello!!!

B:hello!!!

666

A:bye!!!

B:bye!!!

上面的代碼存在循環引用,刪除a和b之后,它們的引用計數還是1,仍然大于0,不會被回收(打印“666”之后)。

標記清除可解決循環引用問題,從根對象(寄存器和程序棧上的引用)出發,遍歷對象,將遍歷到的對象打上標記(垃圾檢測),然后在內存中清除沒有標記的對象(垃圾回收)。上面的例子中,a和b相互引用,如果與其他對象沒有引用關系就不會遍歷到它,也就不會被標記,所以會被清除。

分代回收

如果頻繁進行標記清除會影響Python性能,有很多對象,清理了很多次他依然存在,可以認為,這樣的對象不需要經常回收,也就是說,對象存在時間越長,越可能不是垃圾。

將回收對象進行分代(一共三代),每代回收的時間間隔不同,其中新創建的對象為0代,如果一個對象能在第0代的垃圾回收過程中存活下來,那么它就被放入到1代中,如果1代里的對象在第1代的垃圾回收過程中存活下來,則會進入到2代。

gc模塊

以下三種情況會啟動垃圾回收:

·調用gc.collect():強制對所有代執行一次回收

·當gc模塊的計數器達到閥值的時候。

·程序退出的時候

gc模塊函數:

·gc.enable():啟用自動垃圾回收

·gc.disable():停用自動垃圾回收

·gc.isenabled():如果啟用了自動回收則返回True。

·gc.collect(generation=2):不設置參數會對所有代執行一次回收

·gc.set_threshold(threshold0[,threshold1[,threshold2]]):設置垃圾回收閾值

·gc.get_count():當前回收計數

·垃圾回收啟動的默認閾值

importgc

print(gc.get_threshold())

輸出:

(700,10,10)

700是垃圾回收啟動的閾值,對象分配數量減去釋放數量的值大于700時,就會開始進行垃圾回收,每10次0代垃圾回收,會導致一次1代回收;而每10次1代的回收,才會有1次的2代回收。可以使用set_threshold()方法重新設置。

以上內容為大家介紹了Python垃圾回收,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/

tags: python培訓
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 在线日韩理论午夜中文电影| 中文字幕在线高清| 三级黄色片子| 亚洲成人福利在线观看| 日韩伦理电影在线免费观看| 3d夜蒲团| 国产真实迷j在线播放| 成人免费观看高清在线毛片| 乱子伦xxxx| 国产精品毛片大码女人| 亚洲动漫在线| 波多野结衣办公室33分钟| 午夜精品久久久久久中宇| 欧美边吃奶边爱边做视频| 毛片日韩| 久久久久久久国产精品电影| 一本久久精品一区二区| 秋霞日韩一区二区三区在线观看| 性生活大片免费观看| 亚洲国产日韩在线成人蜜芽| j8又粗又长又硬又爽免费视频| 蜜桃成熟之蜜桃仙子| 新97人人模人人爽人人喊| 美女又黄又免费的视频| 波多野结衣一区在线| 色丁香在线| 美国式禁忌芭芭拉| 天天射天天干天天| 91成人高清在线播放| 6080一级毛片| 加勒比色综合久久久久久久久| 亚洲综合三区| 第四色最新网站| 思思久久99热只有频精品66| 国产破外女出血视频| 欧美人与动人物乱大交| 37大但人文艺术a级| 小受被强攻按做到哭男男| 亚洲有码转帖| 亚洲无限资源| 国产精品一区二区久久|