Python Memory Management

Python的內(nèi)存管理機(jī)制可以從三個(gè)方面來講:

  • 引用計(jì)數(shù)
  • 垃圾回收
  • 內(nèi)存池機(jī)制

引用計(jì)數(shù)

Python采用了類似Windows內(nèi)核對象一樣的方式來對內(nèi)存進(jìn)行管理训裆。每一個(gè)對象,都維護(hù)這一個(gè)對指向該對對象的引用的計(jì)數(shù)尚镰。

引用計(jì)數(shù)加1:

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

引用計(jì)數(shù)減少:

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

垃圾回收

1师逸、當(dāng)內(nèi)存中有不再使用的部分時(shí)司倚,垃圾收集器就會(huì)把他們清理掉。它會(huì)去檢查那些引用計(jì)數(shù)為0的對象篓像,然后清除其在內(nèi)存的空間动知。當(dāng)然除了引用計(jì)數(shù)為0的會(huì)被清除,還有一種情況也會(huì)被垃圾收集器清掉:當(dāng)兩個(gè)對象相互引用時(shí)员辩,他們本身其他的引用已經(jīng)為0了盒粮。
2、垃圾回收機(jī)制還有一個(gè)循環(huán)垃圾回收器, 確保釋放循環(huán)引用對象(a引用b, b引用a, 導(dǎo)致其引用計(jì)數(shù)永遠(yuǎn)不為0)奠滑。

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

Python的內(nèi)存機(jī)制以金字塔行丹皱,-1,-2層主要有操作系統(tǒng)進(jìn)行操作宋税,
第0層是C中的malloc摊崭,free等內(nèi)存分配和釋放函數(shù)進(jìn)行操作;
第1層和第2層是內(nèi)存池杰赛,有Python的接口函數(shù)PyMem_Malloc函數(shù)實(shí)現(xiàn)呢簸,當(dāng)對象小于256K時(shí)有該層直接分配內(nèi)存;
第3層是最上層淆攻,也就是我們對Python對象的直接操作阔墩;

Python提供了對內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)瓶珊。
正如上面提到的啸箫,Python中所有小于256個(gè)字節(jié)的對象都使用pymalloc實(shí)現(xiàn)的分配器(這里還是會(huì)調(diào)用 malloc 分配內(nèi)存,但每次會(huì)分配一塊大小為256k的大塊內(nèi)存.),而大的對象則使用系統(tǒng)的 malloc伞芹。另外Python對象忘苛,如整數(shù),浮點(diǎn)數(shù)和List唱较,都有其獨(dú)立的私有內(nèi)存池扎唾,對象間不共享他們的內(nèi)存池。也就是說如果你分配又釋放了大量的整數(shù)南缓,用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)胸遇。經(jīng)由內(nèi)存池登記的內(nèi)存到最后還是會(huì)回收到內(nèi)存池,并不會(huì)調(diào)用 C 的 free 釋放掉.以便下次使用.對于簡單的Python對象,例如數(shù)值汉形、字符串纸镊,元組(tuple不允許被更改)采用的是復(fù)制的方式(深拷貝?)倍阐,也就是說當(dāng)將另一個(gè)變量B賦值給變量A時(shí),雖然A和B的內(nèi)存空間仍然相同逗威,但當(dāng)A的值發(fā)生變化時(shí)峰搪,會(huì)重新給A分配空間,A和B的地址變得不再相同凯旭。   
注:在Python中概耻,許多時(shí)候申請的內(nèi)存都是小塊的內(nèi)存,這些小塊內(nèi)存在申請后罐呼,很快又會(huì)被釋放鞠柄,由于這些內(nèi)存的申請并不是為了創(chuàng)建對象,所以并沒有對象一級的內(nèi)存池機(jī)制嫉柴。這就意味著Python在運(yùn)行期間會(huì)大量地執(zhí)行malloc和free的操作春锋,頻繁地在用戶態(tài)和核心態(tài)之間進(jìn)行切換,這將嚴(yán)重影響 Python的執(zhí)行效率差凹。為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制侧馅,用于管理對小塊內(nèi)存的申請和釋放危尿。這也就是之前提到的 Pymalloc機(jī)制。

接著馁痴,我們繼續(xù)談python內(nèi)存情況谊娇,在面試過程中被問到

python中的list在內(nèi)存中是以數(shù)組方式存儲(chǔ)還是鏈表的方式呢?罗晕?济欢?

通過查閱一些資料,發(fā)現(xiàn)list的存儲(chǔ)方式是arraylist(動(dòng)態(tài)數(shù)組)小渊,與它相對應(yīng)的是linkedlist(鏈表)法褥,arraylist其實(shí)就是數(shù)組了,其實(shí)就相當(dāng)于C++中的vector酬屉,只不過這時(shí)的list可以存儲(chǔ)不同類型的元素半等。那么我們明白了這些后,使用的時(shí)候才會(huì)更加注意對于插入或者刪除頻繁的時(shí)候呐萨,list效率是比較低的杀饵,畢竟它存儲(chǔ)形式是arraylist。
python中的tuple存儲(chǔ)形式是什么呢谬擦?
tuple在內(nèi)存中的存儲(chǔ)形式就是常量數(shù)組切距,因?yàn)樗遣豢勺兊臄?shù)據(jù)類型,所以常量數(shù)組估計(jì)大家都能理解惨远。
python中的dictionary存儲(chǔ)形式是什么呢谜悟?
字典相當(dāng)于C++標(biāo)準(zhǔn)庫中的map
字符串呢
字符串其實(shí)就是不能修改的list话肖,也是數(shù)組的形式,這和c/c++是一致的赌躺。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狼牺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子礼患,更是在濱河造成了極大的恐慌是钥,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缅叠,死亡現(xiàn)場離奇詭異悄泥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肤粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門弹囚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人领曼,你說我怎么就攤上這事鸥鹉。” “怎么了庶骄?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵毁渗,是天一觀的道長。 經(jīng)常有香客問我单刁,道長灸异,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任羔飞,我火速辦了婚禮肺樟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逻淌。我一直安慰自己么伯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布恍风。 她就那樣靜靜地躺著蹦狂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朋贬。 梳的紋絲不亂的頭發(fā)上凯楔,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音锦募,去河邊找鬼摆屯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虐骑。 我是一名探鬼主播准验,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼廷没!你這毒婦竟也來了糊饱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颠黎,失蹤者是張志新(化名)和其女友劉穎另锋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狭归,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夭坪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了过椎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片室梅。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疚宇,靈堂內(nèi)的尸體忽然破棺而出亡鼠,到底是詐尸還是另有隱情,我是刑警寧澤敷待,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布拆宛,位于F島的核電站,受9級特大地震影響讼撒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜股耽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一根盒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧物蝙,春花似錦炎滞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至震嫉,卻和暖如春森瘪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背票堵。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工扼睬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悴势。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓窗宇,卻偏偏與公主長得像措伐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子军俊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,579評論 1 118
  • 雖然是自己轉(zhuǎn)載的但是是真的好的一篇圖文并茂的對垃圾回收機(jī)制的講解!!! 先來個(gè)概述侥加,第二部分的畫述才是厲害的。 G...
    東皇Amrzs閱讀 118,670評論 13 176
  • Luna.118號拖著松垮的臂膀粪躬,踉踉蹌蹌的向著那光點(diǎn)走去担败,另一只手臂正往上加機(jī)械油。美好的短蜕,希望氢架,快樂...
    相佯閱讀 180評論 0 0
  • 提到春城岖研,你腦海中會(huì)浮現(xiàn)什么?是不是覺得就是四季如春警检,百花齊放孙援,百鳥爭鳴……等等。如果你是這么想的扇雕,我代表兩年前的...
    pekeyo閱讀 504評論 1 0
  • Block基礎(chǔ)回顧 1.什么是Block拓售? 帶有局部變量的匿名函數(shù)(名字不重要,知道怎么用就行)镶奉,差不多就與C語言...
    Bugfix閱讀 6,766評論 5 61