20191031 Python底層機制

2022-07-20 08:45:08 字數 1333 閱讀 3129

python底層從3個方面來說,分別是:

引用計數機制

垃圾**機制

記憶體池機制

引用計數機制

使用引用計數來追蹤記憶體中的物件,所有物件都有引用計數,並且這個引用計數一般比我們想象的次數多,對於不可變資料(如數字和字串),直譯器會在程式的不同部分共享記憶體,以便節約記憶體,可以通過sys.getrefcount( )來檢視物件應用次數。如下:

>>> a =19880924

>>> sys.getrefcount(19880924)

3>>> b =19880924

>>> sys.getrefcount(19880924)

3>>> c = 19880924

>>> sys.getrefcount(19880924)

可以看到19880924的引用次數沒有隨著物件的宣告而增加。

>>> c = 19880924

>>> sys.getrefcount(19880924)

3>>> sys.getrefcount(c)

2>>> d = c

>>> sys.getrefcount(c)

3>>> e = c

>>> sys.getrefcount(c)

4但是如果是物件的引用,則物件的引用次數增加

記憶體儲存機制類似如下:

引用計數增加的情況:

1,乙個物件分配乙個新名稱

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

引用計數減少的情況:

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

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

垃圾**機制

當乙個物件的引用計數為0的時候就被垃圾**給**掉了

直譯器會定期執行乙個迴圈檢測器,搜尋不可訪問物件的迴圈並刪除它們。

a)     假如2個物件相互引用,由於每個物件都包含乙個對其他物件的應用,因此引用計數不會歸零,物件也不會銷毀。針對這種情況適用於2

記憶體池機制

pymalloc機制:引入記憶體池機制,是用於管理小塊記憶體的申請和釋放的,python中所有小於256個位元組的物件都使用pymalloc實現的分配器,而大的物件則使用系統的malloc。對於python物件,如整數,浮點數和list,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。

python**的記憶體放到記憶體池而不是返回給作業系統。

objective c底層 runtime機制

runtime是oc的真面目。oc底層的一套c語言api.unsigned int count 獲取屬性列表 objc property t propertylist class copypropertylist self class count for unsigned int i 0 i 獲取方...

Python 歷史 底層語法

cup 相當於大腦,用於計算 記憶體 儲存資料,4g,8g,16g,成本高,斷電即消失 硬碟 長久儲存資料,重要檔案 作業系統 應用程式。巨集觀上 python2 與 python3 區別 python2 原始碼不標準,混亂,重複 太多。客觀原因2版本以前大部分都是由不同語言種類的大牛共同編寫,語言...

Python 物件底層實現分析

pyobject物件是一切python物件共有的部分,包含以下內容 typedef struct object pyobject pyobject是所有物件共有的頭部,所以可以通過pyobject 來引用任意乙個物件,類似於c 的繼承。python中除了有物件可分為兩種 定長物件 int,float...