首頁技術(shù)文章正文

Python怎樣進(jìn)行內(nèi)存管理?

更新時間:2021-03-05 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif


Python中主要通過引用計數(shù)和內(nèi)存池機(jī)制進(jìn)行內(nèi)存管理。

一、引用計數(shù)機(jī)制
Python內(nèi)部使用引用計數(shù)(記錄對象有多少個引用)來保持追蹤內(nèi)存中的對象,當(dāng)對象被創(chuàng)建時,該對象的引用計數(shù)加1;當(dāng)對象被銷毀時,該對象的引用計數(shù)變?yōu)?,它會被當(dāng)做垃圾進(jìn)行回收。

1.引用計數(shù)增加的情況
(1)對象被創(chuàng)建,如x=4。
(2)賦值給其它變量,如y=x。
(3)被作為參數(shù)傳遞給函數(shù),如foo(x)。
(4)作為容器對象的一個元素,如a=[1,x,'33']。

2.引用計數(shù)減少的情況
(1)對象的引用離開它的作用域,比如, foo(x)函數(shù)執(zhí)行結(jié)束時,x引用的對象引用計數(shù)減1。
(2)對象的引用被顯式地銷毀,如del x或del y。
(3)對象的別名被賦值給其他對象,x=789。
(4)對象從窗口對象中被移除,a.remove(x)。

3.垃圾回收
(1)垃圾收集器會回收引用計數(shù)為0的對象,并清除這些對象占用的內(nèi)存空間。
(2)當(dāng)兩個對象相互引用時,若它們沒有被其它引用所持有,則會被垃圾收集器回收。
(3)垃圾回收機(jī)制還有一個循環(huán)垃圾回收器,它可以確保釋放循環(huán)引用對象(a引用b, b引用a)。

二、內(nèi)存池機(jī)制

在Python中,很多時候申請的內(nèi)存都是小塊內(nèi)存,這些小塊內(nèi)存在申請不久后又會被釋放,這就意味著程序在運(yùn)行期間會大量地執(zhí)行申請和釋放操作,影響Python的執(zhí)行效率。為了加快Python的執(zhí)行效率,Python引入了一個內(nèi)存池機(jī)制,用于管理對小塊內(nèi)存的申請和釋放。

Python中所有小于256個字節(jié)的對象都使用內(nèi)存池的分配器。另外,一些Python對象,如整數(shù)、浮點(diǎn)數(shù)或列表,都擁有獨(dú)立的內(nèi)存池,對象之間不會共享這些獨(dú)立的內(nèi)存池。也就是說,若分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存池將不再分配給浮點(diǎn)數(shù)。


猜你喜歡:
Python實戰(zhàn)開發(fā)項目視頻教程:美多商城開發(fā)實戰(zhàn)【傳智教育】

使用compile()函數(shù)編譯正則表達(dá)式【Python技術(shù)文章】

python raise拋出異常的3種形式

黑馬程序員Python培訓(xùn)課程

分享到:
在線咨詢 我要報名
和我們在線交談!