Python內存分配

python中對象內存分配的祕密:
http://note.youdao.com/noteshare?id=4f2a12ca09e6ec21d3ea03d05e2744e9python

sys模塊是Python比較基礎且十分重要的模塊
功能: 提供程解釋器使用(或者由他維護)的變量,以及和解釋器交互的函數

sys模塊中的getsizeof()函數用戶獲取對象所佔直接內存字節大小(byte),不計算對象內部引用對象佔用內存大小
1.首先咱們驗證一下上面這句話;

In [2]: import sys                                                                                                                                                        
In [3]: a = [1,2]                                                                                                                                                         
In [4]: b = [a,a]                                                                                                                                                         
In [5]: sys.getsizeof(a)                                                                                                                                                  
Out[5]: 80
In [6]: sys.getsizeof(b)                                                                                                                                                  
Out[6]: 80
In [7]: a                                                                                                                                                                 
Out[7]: [1, 2]
In [8]: b                                                                                                                                                                 
Out[8]: [[1, 2], [1, 2]]
能夠看到上面數組,a,b兩個列表內部只有兩個元素,雖然b列表引用了列表a,可是它所佔字節大小a同樣,這樣就說明了getsizeof()方法是計算當前對象直接所佔內存字節大小,不會計算其內部引用.

2,python中空對象所佔內存字節

In [4]: sys.getsizeof('')   # 空字符                                                                                                                                                
Out[4]: 49
In [5]: sys.getsizeof([])   # 空列表                                                                                                                                              
Out[5]: 64
In [6]: sys.getsizeof({})   # 空字典                                                                                                                                              
Out[6]: 240
In [7]: sys.getsizeof(())   # 空元組                                                                                                                                             
Out[7]: 48
In [8]: sys.getsizeof(set())# 空集合                                                                                                                                            
Out[8]: 224

佔用內存字節對象排序: 基礎數字 < 空元祖 < 空字符串 < 空列表 < 空集合 < 空字典
爲何空對象也會佔用內存?
解釋: 咱們能夠理解爲上述對象都是容器,python在建立的時候分配一部分內存用於對象自己信息的記錄,好比(容器結構,引用計數,使用信息等),另外一部分用於預分配內存

3.Boolen值佔用內存字節數

In [15]: sys.getsizeof(0)                                                                                                                                                 
Out[15]: 24
In [16]: sys.getsizeof(False)                                                                                                                                             
Out[16]: 24
In [17]: sys.getsizeof(1)                                                                                                                                                 
Out[17]: 28
In [18]: sys.getsizeof(True)                                                                                                                                              
Out[18]: 28
經過上面樣例咱們能夠看到,布爾值對象的內存所佔字節大小和數字0,1是同樣的,應爲在Boolen中True和1,False和0,表明的含義是同樣的,只是表現形式不同

4.python的內存分配機制:
(1).超額分配機制:對象在申請內存時候,會多分配一部分內存,當有新的元素加入到對象中,就不會再去請求內存分配,直接使用以前超額分配的內存,這樣的話就保證了對象老是會有多餘的內存容納新加入的元素,而不用在加入對象時候再去申請內存操做,提升對象的內存分配性能.
(2).非均勻分配機制; 在分配內存的時候每次分配的內存大小是不同的,保證了不一樣元素加入時候,對象中超額的內存老是可以容納新的元素,不用再加入的時候去申請內存.
相關文章
相關標籤/搜索