基于C说话的字典构造
以下基于C说话的数据构造用于存储字典的键/值对(也称作 entry),存储内容有哈希值,键和值。PyObject 是 Python 对象的一个基类。
- typedef struct {
- Py_ssize_t me_hash;
- PyObject *me_key;
- PyObject *me_value
- } PyDictEntry;
- typedef struct _dictobject PyDictObject;
- struct _dictobject {
- PyObject_HEAD
- Py_ssize_t ma_fill;
- Py_ssize_t ma_used;
- Py_ssize_t ma_mask;
- PyDictEntry *ma_table;
- PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash);
- PyDictEntry ma_smalltable[PyDict_MINSIZE];
- };
字典初始化
字典在初次创建时将调用PyDict_New()函数。这里删掉落了源代码中的部分行,并且将C说话代码转换成了伪代码以凸起个中的几个关键概念。
- returns new dictionary object
- function PyDict_New:
- allocate new dictionary object
- clear dictionary's table
- set dictionary's number of used slots + dummy slots (ma_fill) to 0
- set dictionary's number of active slots (ma_used) to 0
- set dictionary's mask (ma_value) to dictionary size - 1 = 7
- set dictionary's lookup function to lookdict_string
- return allocated dictionary object
添加项
添加新的键/值对调用的是PyDict_SetItem()函数。函数将应用一个指针指向字典对象和键/值对。这一过程中,起首会检查键是否是字符串,然后计算哈希值,如不雅先前已经计算并缓存了键的哈希值,则直接应用缓存的值。接着调用insertdict()函数添加新键/值对。如不雅晃荡槽和空槽的总数跨越数组长度的2/3,则需调剂数组的长度。为什么是 2/3 ?这主如果为了包管探测序列可以或许以足够快的速度找到余暇槽。后面我们会介绍调剂长度的函数。
- arguments: dictionary, key, value
- returns: 0 if OK or -1
- function PyDict_SetItem:
- if key's hash cached:
- use hash
- else:
- calculate hash
- call insertdict with dictionary object, key
推荐阅读
PUE申报精度电力应用效力(PUE)是一个评价数据中间能源效力的通用指标,是数据中间消费的所有能源竽暌闺IT负载应用的能源之比。PUE能赞助数据中间经理有效地治理能耗设备。计算某数据中间举措措施的PUE值有很多原因,>>>详细阅读
本文标题:深入Python字典的内部实现
地址:http://www.17bianji.com/lsqh/35357.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示