您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python開發的內存管理機制及調優方式”,在日常操作中,相信很多人在Python開發的內存管理機制及調優方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python開發的內存管理機制及調優方式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一、內存管理機制:引用計數、垃圾回收、內存池。
二、引用計數:引用計數是一種非常高效的內存管理手段, 當一個 Python 對象被 引用時其引用計數增加1, 當其不再被一個變量引用時則計數減 1.當引用計數等于 0 時對象被刪除。
三、垃圾回收 :
1. 引用計數
引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的垃 圾收集技術。當Python 的某個對象的引用計數降為 0 時,說明沒 有任何引用指向該對象,該對象就成為要被回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數變為 1。如果引用被刪除,對象的引用計數為 0,那么該對象就可以被垃圾回收。不過如果出現循環引用的話,引用計數機制就不再起有效的作用了
2. 標記清除
如果兩個對象的引用計數都為 1,但是僅僅存在他們之間的循環引用,那么這兩個對象都是需要被回收的,也就是說,它們的引用計數雖然表現為非 0,但實際上有效的引用計數為 0。所以先將循環引用摘掉,就會得出這兩個對象的有效計數。
3. 分代回收
從前面“標記-清除”這樣的垃圾收集機制來看,這種垃圾收集機制所帶來的額外操作實際上與系統中總的內存塊的數量是相關的,當需要回收的內存塊越多時,垃圾檢測帶來的額外操作就越多,而垃圾回收帶來的額外操作就越少;反之,當需回收的內存塊越少時,垃圾檢測就將比垃圾回收帶來更少的額外操作。
舉個例子:
當某些內存塊 M 經過了 3 次垃圾收集的清洗之后還存活時,我們就將內存塊 M 劃到一個集合 A 中去,而新分配的內存都劃分到集合 B 中去。當垃圾收集開始工作時,大多數情況都只對集合 B 進行垃圾回收,而對集合 A 進行垃圾回收要隔相當長一段時間后才進行這就使得垃圾收集機制需要處理的內存少了,效率自然就提高了。在這個過程中,集合 B 中的某些內存塊由于存活時間長而會被轉移到集合 A 中,當然,集合 A 中實際上也存在一些垃圾,這些垃圾的回收會因為這種分代的機制而被延遲。
內存池:
Python 的內存機制呈現金字塔形狀,-1,-2 層主要有操作系統進行操作;
第 0 層是 C 中的 malloc,free 等內存分配和釋放函數進行操作;
第 1 層和第 2 層是內存池,有 Python 的接口函數 PyMem_Malloc函數實現,當對象小于 256K 時有該層直接分配內存;
第 3 層是最上層,也就是我們對 Python 對象的直接操作;Python 在運行期間會大量地執行 malloc 和 free 的操作,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響 Python 的執行效率。
為了加速 Python 的執行效率,Python 引入了一個內存池機制,用于管理對小塊內存的申請和釋放。
Python 內部默認的小塊內存與大塊內存的分界點定在 256 個字節,當申請的內存小于 256 字節時,PyObject_Malloc 會在內存池中申請內存;當申請的內存大于 256 字節時,PyObject_Malloc 的行為將蛻化為 malloc 的行為。當然,通過修改 Python 源代碼,我們可以改變這個默認值,從而改變 Python 的默認內存管理行為。
四、了解python調優手段
1.手動垃圾回收
2.調高垃圾回收閾值
3.避免循環引用(手動解循環引用和使用弱引用)
到此,關于“Python開發的內存管理機制及調優方式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。