技術分享:Python如何進行記憶體管理?

千鋒武漢發表於2021-06-10

  Python中主要透過引用計數和記憶體池機制進行記憶體管理。 下面,小千詳細來說說這兩種方法。

  一、引用計數機制

  Python內部使用引用計數(記錄物件有多少個引用)來保持追蹤記憶體中的物件,當物件被建立時,該物件的引用計數加1;當物件被銷燬時,該物件的引用計數變為0,它會被當做垃圾進行回收。

  引用計數增加的情況:

  (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)物件從視窗物件中被移除,a.remove(x)。

  垃圾回收:

  (1)垃圾收集器會回收引用計數為0的物件,並清除這些物件佔用的記憶體空間。

  (2)當兩個物件相互引用時,若它們沒有被其它引用所持有,則會被垃圾收集器回收。

  (3)垃圾回收機制還有一個迴圈垃圾回收器,它可以確保釋放迴圈引用物件(a引用b, b引用a)。

  二、記憶體池機制

  在Python中,很多時候申請的記憶體都是小塊記憶體,這些小塊記憶體在申請不久後又會被釋放,這就意味著程式在執行期間會大量地執行申請和釋放操作,影響Python的執行效率。為了加快Python的執行效率,Python引入了一個記憶體池機制,用於管理對小塊記憶體的申請和釋放。

  Python中所有小於256個位元組的物件都使用記憶體池的分配器。另外,一些Python物件,如整數、浮點數或列表,都擁有獨立的記憶體池,物件之間不會共享這些獨立的記憶體池。也就是說,若分配又釋放了大量的整數,用於快取這些整數的記憶體池將不再分配給浮點數。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2765635/,如需轉載,請註明出處,否則將追究法律責任。

相關文章