最近重溫《Python源碼剖析》一書,將python基本對象的要點記錄如下
python 整數(shù)對象
1.python中的整數(shù)使用c語言中的long類型存儲
2.python int進行加法會檢查結(jié)果是否溢出,如果溢出則自動轉(zhuǎn)換為pyLongObject對象
3.python中的文檔無縫集成在語言實現(xiàn)中
1 a = 11
2 print a.__doc__
4.小整數(shù)對象完全緩存在內(nèi)存中,其他整數(shù)對象輪流使用一塊內(nèi)存空間
5.小整數(shù)對象在python初始化中調(diào)用的_PyInt_Init中創(chuàng)建,然后就一直存在著, 直到python虛擬機退出
python String對象
1.pyStringObject在創(chuàng)建之后,內(nèi)部維護的字符串不能再改變
2.intern機制是否只在字符數(shù)組長度0或者1的時候使用? 書中提供的代碼太過于精簡了,沒講清楚,但是看后面的演示結(jié)果,應(yīng)該是所有的字符串都實現(xiàn)了intern機制
3.字符串連接操作嚴重影響python程序執(zhí)行效率,使用join只需分配一次內(nèi)存,能夠大大提高效率.用法舉例
"".join(['s1','s2','s3'])
Python Dict對象
1.Python中的dict采用hashtable而不是R-B Tree。
2.采用開放定址法解決沖突。
3.為保證沖突探測鏈的連續(xù)性,采用偽刪除技術(shù),active對象刪除則設(shè)置為dummy態(tài)
4.為減少沖突,轉(zhuǎn)載率大于2/3時則改變table的大小,每次增大4倍,如果table中的active態(tài)的元素個數(shù)大于50000時(巨型表),
則放慢增長速度,每次增長2倍。可以看出Python中dict的查找效率較高,而對于內(nèi)存的使用是省了又省,還考慮了巨型表增長減少倍數(shù)。
Python List對象
1.PyListObject類似STL中的Vector。
2.Python對內(nèi)存的使用十分節(jié)儉,如果list改變的新尺寸不到分配內(nèi)存的1/2,則收縮內(nèi)存.
3.在Pylist中建插入元素需要逐個移動后面的元素,類似C中的數(shù)組,因此需要盡量避免對中間元素的插入和刪除操作。
4.STL和PyListObject自動擴容算法對比:個人覺得list改名為array比較恰當一些,嘿嘿
//sgi STL:
len = (old_size != 0 )?2*oldsize:1
//(不夠用則擴充兩倍,如果開始為空則設(shè)置為1)
//Python:
new_allocated=(newsize>>3)+(newsize<9?3:6)
//(???)
5.對于增長倍數(shù)的選擇,這里有討論
http://en.w3support.net/index.php?db=so&id=1100311
p70書中筆誤 :"allcated/2"應(yīng)改為"allocated/2"