注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

偶有所得,记录在此

有分享交流才有进步,永远不要固步自封

 
 
 

日志

 
 

[读Python 源码剖析] 整数对象,字符串对象,List 对象, Dict 对象  

2011-02-09 18:02:49|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
整数对象
------------------
Python 的整数对象一章,内容很少,主要讲如何用一个 free_list 来快速创建 PyIntObject,避免不断创建和销毁 PyIntObject 而造成性能损失。小整数优化很鸡肋。

其实基本所有类型的对象都应用了对象缓冲技术来加快对象的创建,如字符串、List、Dict 等。

字符串对象
------------------
1) Python 中,空字符串和单字符串在内存中只存在一份,需要时直接返回相应对象,不会创建新的一份。

2) 字符串以 "\0" 结尾绝对算上是 C 语言的一个缺陷。字符串至少要有两个属性:地址、长度;Nginx 就实现了一个这样的结构体 ngx_str_t。

3) 为了节省内存(完全不会提高效率),Python 引入了String 的缓存(莫非叫 Intern 机制 ?) 机制。Python 用一个 map 存储下字符串对象地址,创建完字符串对象后,查找该对象指向的字符串是否已经在 map 中存在,如果存在,则销毁本对象,返回缓存的对象。这个缓存机制只在部分场合使用,具体可以搜索下 PyString_InternInPlace 的调用情况。

4) join 来提高字符串拼接效率,这个简单思考下实现原理应该就可以想到。

List 对象
------------------
1) PyListObject 对象存储的是 PyObject 类型的指针数组。

3) 如果空间不足,则采用下面算法来计算新的空间的大小
 
    new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;

最后会执行 realloc。

2) 如果 List 元素个数少于所分配空间的一半,为节省空间,Python 会进行 list_resize,新空间大小的计算方法和上面一样,最终也会调用的是 realloc。

Dict 对象
--------------------
1) 采用散列表实现。

2) 采用的算法是 Algorithm D from Knuth Vol. 3, Sec. 6.4,详细请参考 lookdict_string 函数。

3) 当 Dict 的元素小于 50000 时,Python 会分配 4 倍的空间给散列表使用。大于 50000 时,为了节省内存,只分配 2 倍的空间;当 Dict 大小发生改变时,所有 Dict Item 都要被重新插入新创建的 Dict。详细请参考 PyDict_SetItem、dictresize、insertdict 等函数。

4) 当 Dict 的空间占用率大于 2/3 时,就会触发 list_resize 操作。
  评论这张
 
阅读(895)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017