python的記憶體管理機制

2022-05-21 16:00:11 字數 1580 閱讀 2545

python的記憶體管理機制可以從三個方面來講:

(1)垃圾**

(2)引用計數

(3)記憶體池機制

python引入了乙個機制:引用計數。

python內部使用引用計數,來保持追蹤記憶體中的物件,python內部記錄了物件有多少個引用,即引用計數,當物件被建立時就建立了乙個引用計數,當物件不再需要時,這個物件的引用計數為0時,它被垃圾**。

總結一下物件會在一下情況下引用計數加1:

1.物件被建立:x=4

2.另外的別人被建立:y=x

3.被作為引數傳遞給函式:foo(x)

4.作為容器物件的乙個元素:a=[1,x,'33'

]引用計數減少情況

1.乙個本地引用離開了它的作用域。比如上面的foo(x)函式結束時,x指向的物件引用減1。

2.物件的別名被顯式的銷毀:del x ;或者del y

3.物件的乙個別名被賦值給其他物件:x=789

4.物件從乙個視窗物件中移除:mylist.remove(x)

5.視窗物件本身被銷毀:del mylist,或者視窗物件本身離開了作用域。

垃圾**

1、當記憶體中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的物件,然後清除其在記憶體的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清掉:當兩個物件相互引用時,他們本身其他的引用已經為0了。

2、垃圾**機制還有乙個迴圈垃圾**器, 確保釋放迴圈引用物件(a引用b, b引用a, 導致其引用計數永遠不為0)。

在python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被釋放,由於這些記憶體的申請並不是為了建立物件,所以並沒有物件一級的記憶體池機制。這就意味著python在執行期間會大量地執行malloc和free的操作,頻繁地在使用者態和核心態之間進行切換,這將嚴重影響python的執行效率。為了加速python的執行效率,python引入了乙個記憶體池機制,用於管理對小塊記憶體的申請和釋放。

記憶體池機制

python提供了對記憶體的垃圾收集機制,但是它將不用的記憶體放到記憶體池而不是返回給作業系統。

python中所有小於256個位元組的物件都使用pymalloc實現的分配器,而大的物件則使用系統的 malloc。另外python物件,如整數,浮點數和list,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。

在python中,許多時候申請的記憶體都是小塊的記憶體,這些小塊記憶體在申請後,很快又會被釋放,由於這些記憶體的申請並不是為了建立物件,所以並沒有物件一級的記憶體池機制。這就意味著python在執行期間會大量地執行malloc和free的操作,頻繁地在使用者態和核心態之間進行切換,這將嚴重影響 python的執行效率。為了加速python的執行效率,python引入了乙個記憶體池機制,用於管理對小塊記憶體的申請和釋放。這也就是之前提到的 pymalloc機制。

Python記憶體管理機制

一 python記憶體 因為要呼叫while迴圈,迴圈內有temp變數,不清楚python是否會在每一輪迴圈結束後自動釋放temp記憶體空間,做了乙個記憶體測試,發現無論temp none,還是del temp,只能銷毀變數,無法完全釋放記憶體空間。注 紅色部分標出相同記憶體id。python vi...

python記憶體管理機制

a 1整數1為乙個物件。而a是乙個引用。利用賦值語句,引用a指向物件1。在python中,整數和短小的字元,python都會快取這些物件,以便重複使用。當我們建立多個等於1的引用時,實際上是讓所有這些引用指向同乙個物件。a 1 b 1 print id a print id b 在python中,每...

python記憶體管理機制

1.引用計數 當乙個python物件被引用時 其引用計數增加 1 當其不再被變數引用時 引用計數減 1 當物件引用計數等於 0 時,物件被刪除 引用計數是一種非常高效的記憶體管理機制 2.垃圾 垃圾 機制 引用計數 標記清除 分帶 引用計數 引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的...