Python Memory Management

Python的內存管理機制可以從三個方面來講:

  • 引用計數
  • 垃圾回收
  • 內存池機制

引用計數

Python采用了類似Windows內核對象一樣的方式來對內存進行管理。每一個對象,都維護這一個對指向該對對象的引用的計數。

引用計數加1:

1.對象被創建:x=4
2.另外的變量被創建:y=x
3.被作為參數傳遞給函數:foo(x)
4.作為容器對象的一個元素:a=[1,x,'33']

引用計數減少:

1.一個本地引用離開了它的作用域。比如上面的foo(x)函數結束時,x指向的對象引用減1。
2.對象的別名被顯式的銷毀:del x
3.對象的一個別名被賦值給其他對象:x=123
4.對象從一個窗口對象中移除:myList.remove(x)
5.窗口對象本身被銷毀:del myList,或者窗口對象本身離開了作用域。

垃圾回收

1、當內存中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的對象,然后清除其在內存的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清掉:當兩個對象相互引用時,他們本身其他的引用已經為0了。
2、垃圾回收機制還有一個循環垃圾回收器, 確保釋放循環引用對象(a引用b, b引用a, 導致其引用計數永遠不為0)。

內存池機制

Python的內存機制以金字塔行,-1,-2層主要有操作系統進行操作,
第0層是C中的malloc,free等內存分配和釋放函數進行操作;
第1層和第2層是內存池,有Python的接口函數PyMem_Malloc函數實現,當對象小于256K時有該層直接分配內存;
第3層是最上層,也就是我們對Python對象的直接操作;

Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。
正如上面提到的,Python中所有小于256個字節的對象都使用pymalloc實現的分配器(這里還是會調用 malloc 分配內存,但每次會分配一塊大小為256k的大塊內存.),而大的對象則使用系統的 malloc。另外Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用于緩存這些整數的內存就不能再分配給浮點數。經由內存池登記的內存到最后還是會回收到內存池,并不會調用 C 的 free 釋放掉.以便下次使用.對于簡單的Python對象,例如數值、字符串,元組(tuple不允許被更改)采用的是復制的方式(深拷貝?),也就是說當將另一個變量B賦值給變量A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會重新給A分配空間,A和B的地址變得不再相同。   
注:在Python中,許多時候申請的內存都是小塊的內存,這些小塊內存在申請后,很快又會被釋放,由于這些內存的申請并不是為了創建對象,所以并沒有對象一級的內存池機制。這就意味著Python在運行期間會大量地執行malloc和free的操作,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響 Python的執行效率。為了加速Python的執行效率,Python引入了一個內存池機制,用于管理對小塊內存的申請和釋放。這也就是之前提到的 Pymalloc機制。

接著,我們繼續談python內存情況,在面試過程中被問到

python中的list在內存中是以數組方式存儲還是鏈表的方式呢???

通過查閱一些資料,發現list的存儲方式是arraylist(動態數組),與它相對應的是linkedlist(鏈表),arraylist其實就是數組了,其實就相當于C++中的vector,只不過這時的list可以存儲不同類型的元素。那么我們明白了這些后,使用的時候才會更加注意對于插入或者刪除頻繁的時候,list效率是比較低的,畢竟它存儲形式是arraylist。
python中的tuple存儲形式是什么呢?
tuple在內存中的存儲形式就是常量數組,因為它是不可變的數據類型,所以常量數組估計大家都能理解。
python中的dictionary存儲形式是什么呢?
字典相當于C++標準庫中的map
字符串呢
字符串其實就是不能修改的list,也是數組的形式,這和c/c++是一致的。

參考文章:
http://hackerxu.com/2015/01/13/ram.html
http://blog.csdn.net/zhangweijiqn/article/details/39235169

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • http://python.jobbole.com/85231/ 關于專業技能寫完項目接著寫寫一名3年工作經驗的J...
    燕京博士閱讀 7,628評論 1 118
  • 雖然是自己轉載的但是是真的好的一篇圖文并茂的對垃圾回收機制的講解!!! 先來個概述,第二部分的畫述才是厲害的。 G...
    東皇Amrzs閱讀 118,855評論 13 176
  • Luna.118號拖著松垮的臂膀,踉踉蹌蹌的向著那光點走去,另一只手臂正往上加機械油。美好的,希望,快樂...
    相佯閱讀 186評論 0 0
  • 提到春城,你腦海中會浮現什么?是不是覺得就是四季如春,百花齊放,百鳥爭鳴……等等。如果你是這么想的,我代表兩年前的...
    pekeyo閱讀 523評論 1 0
  • Block基礎回顧 1.什么是Block? 帶有局部變量的匿名函數(名字不重要,知道怎么用就行),差不多就與C語言...
    Bugfix閱讀 6,801評論 5 61