XGuru's Blog

技术,是一种态度。关注:高性能后端技术/服务器架构/C++/C/LAMP

   :: 首页 :: 联系 :: 聚合  :: 管理
  20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

公告





twitter / xoXGuru

feedsky
抓虾
google reader
鲜果
QQ邮箱
九点

常用链接

留言簿(12)

搜索

  •  

最新评论

阅读排行榜

最近重温《Python源码剖析》一书,将python基本对象的要点记录如下
python 整数对象
1.python中的整数使用c语言中的long类型存储
2.python int进行加法会检查结果是否溢出,如果溢出则自动转换为pyLongObject对象
3.python中的文档无缝集成在语言实现中
1 = 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"

posted on 2011-07-21 23:16 XGuru 阅读(2500) 评论(1)  编辑 收藏 引用

Feedback

# re: [原创]Python基本对象学习笔记 2012-01-04 21:20 laisijia@gmail.com
”intern机制是否只在字符数组长度0或者1的时候使用? 书中提供的代码太过于精简了,没讲清楚,但是看后面的演示结果,应该是所有的字符串都实现了intern机制。”我也不是很明白这个问题,但是我在看pyc文件的写入和读出的那一章时,发现string写入pyc的时候有三种可能,一种是不用intern的string,一种是使用intern的string首次写入,一种是使用intern的string的非首次写入。所以不应该是所有的字符串都intern了吧。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理