1. 程式人生 > >[python 源碼]整數對象的創建和維護

[python 源碼]整數對象的創建和維護

系統 十個 。。 col 為什麽 參數 結果 太多的 發現

剛開始學python時候,發現一個很迷惑的現象,一直到看了源碼後才知道了:

>>> a=6
>>> b=6
>>> a is b
True

想用同樣的參數初始化兩個對象,結果卻是,這兩個對象其實是同樣的對象????逗我呢?

>>> a=666
>>> b=666
>>> a is b
False

這又是怎麽回事?為什麽現在又是False了???

這些不同,主要來自於python中對待小整數和大整數的初始化方式不同,而且他們都是在對象池中的,只不過所在的對象池不同。。。

那麽,什麽是小整數,什麽又是大整數?在python中默認-5~256為小整數,其余的為大整數。。。

>>> a=256
>>> b=256
>>> a is b
True
>>> a=257
>>> b=257
>>> a is b
False

那麽問題又來了,為什麽要區分小整數和大整數?

因為如果不停的調用malloc和free,會嚴重的影響python的性能,為了減少malloc和free的次數,python會預先初始化所有小整數的對象,也就是說,在我們用小整數對象的時候,沒有創建,沒有初始化,而是得到了一個本來就在內存中的小整數對象的引用

如果小整數太多的話,會占用太多的內存,也會影響性能的,所以Guido大叔就默認了-5~256為小整數。

那麽,大整數是怎麽初始化的?

為了減少創建大整數對象時候減少malloc和free的次數,當用到大整數時候,python會一次malloc幾十個大整數對象的鏈表,稱為一個block,然後用一個block_list指針指向已經占用的所有對象的鏈表,當這個block用完的時候,再malloc從下一個block。

那麽,問題又來了,比如,如果第二個block中的內存還沒用完,第一個block中已經有對象不用了怎麽辦?豈不是就浪費了

在python中,會有一個free_list的指針指向所有可用的對象內存,當某個對象不用的時候,就添加到free_list鏈表中,同時從block_list中移除。

發現了什麽,竟然只有malloc,沒有free,沒有內存交換系統。

python中應該還有另外一個機制防止內存泄露。。。這個現在就還不明白怎麽做到的了

參考資料:python源碼剖析

[python 源碼]整數對象的創建和維護