python底層原理


有同學問到了一個問題,python中存儲變量是通過內存地址來存儲,那么python又是如何去判斷內存中的地址是什么數據類型的呢。經過查找,找到這篇文章:

原博客地址:http://www.cnblogs.com/aashui/p/9871009.html

1.Python是如何進行內存管理的?

答:從三個方面來說,一對象的引用計數機制,二垃圾回收機制,三內存池機制

一、對象的引用計數機制

Python內部使用引用計數,來保持追蹤內存中的對象,所有對象都有引用計數。

引用計數增加的情況:

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

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

引用計數減少的情況:

1,使用del語句對對象別名顯示的銷毀

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

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

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

二、垃圾回收

1,當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。

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

三、內存池機制

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

1,Pymalloc機制。為了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。

2,Python中所有小於256個字節的對象都使用pymalloc實現的分配器,而大的對象則使用系統的malloc。

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

由上述可以看出,當我們創建一個整數變量如,Num_int = 1   此時必定會有一個內存地址A(假設)指向1這個數據。此時Num_Int 指向的地址也是地址A。當我們創建這個整數對象時,實際上1這個數據已經存向了我們內存中指定存放整數的地方,如下圖:

也就是說,在我們創建整數變量或者其他變量時,python已經幫你找到了固定的位置,然后你將數據存進去就可以了。不管你怎么存,只是地址變了,並且你的地址如果是相同的數據類型,那么應該是有相似點的,比如  A (內存地址) = 10001  那么可能你再創建一個變量 時 B(內存地址) = 10002 。本人理解是這樣,若有不對請指出,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM