最近重温《Python源码剖析》一书,将python基本对象的要点记录如下
python 整数对象
1.python中的整数使用c语言中的long类型存储
2.python int进行加法会检查结果是否溢出,如果溢出则自动转换为pyLongObject对象
3.python中的文档无缝集成在语言实现中
1 a = 11
2 print a.__doc__
4.小整数对象完全缓存在内存中,其他整数对象轮流使用一块内存空间
5.小整数对象在python初始化中调用的_PyInt_Init中创建,然后就一直存在着, 直到python虚拟机退出
python String对象
1.pyStringObject在创建之后,内部维护的字符串不能再改变
2.intern机制是否只在字符数组长度0或者1的时候使用? 书中提供的代码太过于精简了,没讲清楚,但是看后面的演示结果,应该是所有的字符串都实现了intern机制
3.字符串连接操作严重影响python程序执行效率,使用join只需分配一次内存,能够大大提高效率.用法举例
"".join(['s1','s2','s3'])
Python Dict对象
1.Python中的dict采用hashtable而不是R-B Tree。
2.采用开放定址法解决冲突。
3.为保证冲突探测链的连续性,采用伪删除技术,active对象删除则设置为dummy态
4.为减少冲突,转载率大于2/3时则改变table的大小,每次增大4倍,如果table中的active态的元素个数大于50000时(巨型表),
则放慢增长速度,每次增长2倍。可以看出Python中dict的查找效率较高,而对于内存的使用是省了又省,还考虑了巨型表增长减少倍数。
Python List对象
1.PyListObject类似STL中的Vector。
2.Python对内存的使用十分节俭,如果list改变的新尺寸不到分配内存的1/2,则收缩内存.
3.在Pylist中建插入元素需要逐个移动后面的元素,类似C中的数组,因此需要尽量避免对中间元素的插入和删除操作。
4.STL和PyListObject自动扩容算法对比:个人觉得list改名为array比较恰当一些,嘿嘿
//sgi STL:
len = (old_size != 0 )?2*oldsize:1
//(不够用则扩充两倍,如果开始为空则设置为1)
//Python:
new_allocated=(newsize>>3)+(newsize<9?3:6)
//(???)
5.对于增长倍数的选择,这里有讨论
http://en.w3support.net/index.php?db=so&id=1100311
p70书中笔误 :"allcated/2"应改为"allocated/2"