Python開發(fā)的內(nèi)存管理機(jī)制及調(diào)優(yōu)方式

這篇文章主要介紹“Python開發(fā)的內(nèi)存管理機(jī)制及調(diào)優(yōu)方式”,在日常操作中,相信很多人在Python開發(fā)的內(nèi)存管理機(jī)制及調(diào)優(yōu)方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Python開發(fā)的內(nèi)存管理機(jī)制及調(diào)優(yōu)方式”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司成立于2013年,先為牟定等服務(wù)建站,牟定等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為牟定企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

一、內(nèi)存管理機(jī)制:引用計(jì)數(shù)、垃圾回收、內(nèi)存池。


二、引用計(jì)數(shù):引用計(jì)數(shù)是一種非常高效的內(nèi)存管理手段, 當(dāng)一個(gè) Python 對(duì)象被 引用時(shí)其引用計(jì)數(shù)增加1, 當(dāng)其不再被一個(gè)變量引用時(shí)則計(jì)數(shù)減 1.當(dāng)引用計(jì)數(shù)等于 0 時(shí)對(duì)象被刪除。


三、垃圾回收


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


引用計(jì)數(shù)也是一種垃圾收集機(jī)制,而且也是一種最直觀,最簡單的垃 圾收集技術(shù)。當(dāng)Python 的某個(gè)對(duì)象的引用計(jì)數(shù)降為 0 時(shí),說明沒 有任何引用指向該對(duì)象,該對(duì)象就成為要被回收的垃圾了。比如某個(gè)新建對(duì)象,它被分配給某個(gè)引用,對(duì)象的引用計(jì)數(shù)變?yōu)?1。如果引用被刪除,對(duì)象的引用計(jì)數(shù)為 0,那么該對(duì)象就可以被垃圾回收。不過如果出現(xiàn)循環(huán)引用的話,引用計(jì)數(shù)機(jī)制就不再起有效的作用了


2. 標(biāo)記清除


如果兩個(gè)對(duì)象的引用計(jì)數(shù)都為 1,但是僅僅存在他們之間的循環(huán)引用,那么這兩個(gè)對(duì)象都是需要被回收的,也就是說,它們的引用計(jì)數(shù)雖然表現(xiàn)為非 0,但實(shí)際上有效的引用計(jì)數(shù)為 0。所以先將循環(huán)引用摘掉,就會(huì)得出這兩個(gè)對(duì)象的有效計(jì)數(shù)。


3. 分代回收


從前面“標(biāo)記-清除”這樣的垃圾收集機(jī)制來看,這種垃圾收集機(jī)制所帶來的額外操作實(shí)際上與系統(tǒng)中總的內(nèi)存塊的數(shù)量是相關(guān)的,當(dāng)需要回收的內(nèi)存塊越多時(shí),垃圾檢測(cè)帶來的額外操作就越多,而垃圾回收帶來的額外操作就越少;反之,當(dāng)需回收的內(nèi)存塊越少時(shí),垃圾檢測(cè)就將比垃圾回收帶來更少的額外操作。


舉個(gè)例子:


當(dāng)某些內(nèi)存塊 M 經(jīng)過了 3 次垃圾收集的清洗之后還存活時(shí),我們就將內(nèi)存塊 M 劃到一個(gè)集合 A 中去,而新分配的內(nèi)存都劃分到集合 B 中去。當(dāng)垃圾收集開始工作時(shí),大多數(shù)情況都只對(duì)集合 B 進(jìn)行垃圾回收,而對(duì)集合 A 進(jìn)行垃圾回收要隔相當(dāng)長一段時(shí)間后才進(jìn)行這就使得垃圾收集機(jī)制需要處理的內(nèi)存少了,效率自然就提高了。在這個(gè)過程中,集合 B 中的某些內(nèi)存塊由于存活時(shí)間長而會(huì)被轉(zhuǎn)移到集合 A 中,當(dāng)然,集合 A 中實(shí)際上也存在一些垃圾,這些垃圾的回收會(huì)因?yàn)檫@種分代的機(jī)制而被延遲。


內(nèi)存池:


Python 的內(nèi)存機(jī)制呈現(xiàn)金字塔形狀,-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)對(duì)象小于 256K 時(shí)有該層直接分配內(nèi)存;


第 3 層是最上層,也就是我們對(duì) Python 對(duì)象的直接操作;Python 在運(yùn)行期間會(huì)大量地執(zhí)行 malloc 和 free 的操作,頻繁地在用戶態(tài)和核心態(tài)之間進(jìn)行切換,這將嚴(yán)重影響 Python 的執(zhí)行效率。


為了加速 Python 的執(zhí)行效率,Python 引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。


Python 內(nèi)部默認(rèn)的小塊內(nèi)存與大塊內(nèi)存的分界點(diǎn)定在 256 個(gè)字節(jié),當(dāng)申請(qǐng)的內(nèi)存小于 256 字節(jié)時(shí),PyObject_Malloc 會(huì)在內(nèi)存池中申請(qǐng)內(nèi)存;當(dāng)申請(qǐng)的內(nèi)存大于 256 字節(jié)時(shí),PyObject_Malloc 的行為將蛻化為 malloc 的行為。當(dāng)然,通過修改 Python 源代碼,我們可以改變這個(gè)默認(rèn)值,從而改變 Python 的默認(rèn)內(nèi)存管理行為。


四、了解python調(diào)優(yōu)手段


1.手動(dòng)垃圾回收


2.調(diào)高垃圾回收閾值


3.避免循環(huán)引用(手動(dòng)解循環(huán)引用和使用弱引用)

到此,關(guān)于“Python開發(fā)的內(nèi)存管理機(jī)制及調(diào)優(yōu)方式”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

新聞名稱:Python開發(fā)的內(nèi)存管理機(jī)制及調(diào)優(yōu)方式
URL標(biāo)題:http://muchs.cn/article26/ihspjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、Google、建站公司、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)