设为首页 收藏本站
查看: 655|回复: 0

[经验分享] 【Python旧时笔记 五】PyDictObject头文件阅读

[复制链接]

尚未签到

发表于 2017-5-6 12:46:57 | 显示全部楼层 |阅读模式
dictobject.h

PyDictObject是一种字典类型,从可哈希的对象映射到另一个对象。
然后提到了在Objects目录下,有dictnotes.txt文件,关于字典的使用设计和优化。


字典类实际上是维护了一张哈希表,而表项,entry or slot,有3种状态。
1. Unused. me_key == me_value == NULL
未使用状态,key和value都为空。
这是表项的初始状态,仅当初始时key才会为空。
2. Active. me_key != NULL and me_key != dummy and me_value != NULL
正在使用状态,key不为空且不为dummy,value不为空。
3. Dummy. me_key == dummy and me_value == NULL
曾使用状态,但该表项已经被删除了。key为dummy,value为空。
设置Dummy状态是因为Python面对hash冲突时所采取的是开放地址法,会再次寻找位置。
所以会产生探索链这样的关联结构,比如A、B、C三者的哈希值一样,那么会处在一条探索链上。
当B被删除后,为了保证能够搜索到C,特地设置Dummy值,表示后面还可能存在有效表项。


#definePyDict_MINSIZE8
PyDict_MINSIZE是一个字典的最小大小,这个“小字典”是直接作为表项的成员的,ma_smalltable。
表项的结构如下:
typedefstruct{
/* Cached hash code of me_key. Note that hash codes are C longs.
* We have to use Py_ssize_t instead because dict_popitem() abuses
* me_hash to hold a search finger.
*/
Py_ssize_tme_hash;
PyObject*me_key;
PyObject*me_value;
}PyDictEntry;
由注释可以知道me_hash的一个作用是避免重复计算,另一个作用是可以用来指向探索链的下一个。


字典的结构如下:
typedefstruct_dictobjectPyDictObject;
struct_dictobject{
PyObject_HEAD
Py_ssize_tma_fill;/*# Active + # Dummy */
Py_ssize_tma_used;/*# Active */


/* The table contains ma_mask + 1 slots, and that's a power of 2.
* We store the mask instead of the size because the mask is more
* frequently needed.
*/
Py_ssize_tma_mask;


/* ma_table points to ma_smalltable for small tables, else to
* additional malloc'ed memory. ma_table is never NULL! This rule
* saves repeated runtime null-tests in the workhorse getitem and
* setitem calls.
*/
PyDictEntry*ma_table;
PyDictEntry*(*ma_lookup)(PyDictObject*mp,PyObject*key,longhash);
PyDictEntryma_smalltable[PyDict_MINSIZE];
};
由注释可知ma_fill和ma_used的含义。
ma_mask经常用来与key的哈希值进行与运算,使其落在表的范围内。
ma_table指向ma_smalltable或者另外分配的内存。


为了保证在表中搜索位置的过程会终止,表中至少有一项Unused。
另外为了避免低效搜索,当有三分之二的表项被使用了,会重新调整表的大小。


JasonLee   2011.08.14   23:35   明天又周一了,今天大连散步

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373831-1-1.html 上篇帖子: Python脚本示例[命令行参数,函数,判定,退出等] 下篇帖子: python之os.walk()与os.path.walk()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表