歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python內存管理機制

Python內存管理機制

日期:2017/3/1 9:44:30   编辑:Linux編程

1 概述

對於Python這樣的動態語言,如何高效的管理內存,是很重要的一部分,在很大程度上決定了Python的執行效率。與大多數編程語言不同,Python中的變量無需事先申明,變量無需指定類型,程序員無需關心內存管理,Python解釋器給你自動回收。我們知道在變量分配內存時,是借用系統資源,在使用完成後,應該歸還所借用的系統資源,Python承擔了這個復雜的內存管理工作,從而讓程序員更加的關注程序的編寫質量上。

在執行過程中,Python會頻繁的創建和銷毀大量的對象,這些都涉及到內存的管理。以下從三個方面來分析Python是如何進行內存管理的。

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

2 對象的引用計數機制

在Python中是通過引用計數來保持對內存中的變量追蹤的,也就是做Python內部記錄中所有在使用對象各有多少個引用。Python中有個內部跟蹤變量叫做引用計數器,每個變量有多少個引用,簡稱引用計數。當某個對象的引用計數為0時,就列入了垃圾回收隊列。

引用計數增加的情況:

1. 一個對象分配一個新名稱

2. 將其放入一個容器中(如列表、元組或字典)

引用計數減少的情況:

1. 使用del語句對對象別名顯式的銷毀

2. 引用超出作用域或被重新賦值

sys.getrefcount( )函數可以獲得對象的當前引用計數

多數情況下,引用計數比你猜測得要大得多。對於不可變數據(如數字和字符串),解釋器會在程序的不同部分共享內存,以便節約內存。

3 垃圾回收機制

3.1 當一個對象的引用計數歸零時,與該對象對應的析構函數就會被調用,但調用析構函數並不意味著最終一定要調用free釋放內存空間,通常是將該對象通過垃圾收集機制處理,將其占用的空間歸還到內存池中。

3.2 當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數,並銷毀用於引用底層對象的名稱。然而由於每個對象都包含一個對其他對象的應用,因此引用計數不會歸零,對象也不會銷毀。(從而導致內存洩露)。為解決這一問題,解釋器會定期執行一個循環檢測器,搜索不可訪問對象的循環並刪除它們。

4 內存池機制

Python提供了對內存的垃圾回收機制,但是它將不用的內存放到內存池而不是返回給操作系統。

4.1 小塊內存池機制Pymalloc機制

在Python中,許多時候申請的內存都是小塊的內存,這些小塊內存在申請後,很快又會被釋放,由於這些內存的申請並不是為了創建對象,所以並沒有對象一級的內存池機制。這就意味著在運行期間,Python會大量的執行malloc和free操作。為了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放,即Pymalloc機制。

1. 當申請的內存小於256字節時,PyObject_Malloc會在內存池中申請內存;當申請的內存大於256字節時,PyObject_Malloc的行為將蛻化為malloc的行為。當然,通過修改Python源代碼,我們可以改變這個默認值,從而改變Python的默認內存管理行為。

2. 對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved