作家
登录

深入Python字典的内部实现

作者: 来源: 2017-05-23 09:25:06 阅读 我要评论

基于C说话的字典构造

以下基于C说话的数据构造用于存储字典的键/值对(也称作 entry),存储内容有哈希值,键和值。PyObject 是 Python 对象的一个基类。

  1. typedef struct { 
  2.  
  3.     Py_ssize_t me_hash; 
  4.  
  5.     PyObject *me_key; 
  6.  
  7.     PyObject *me_value 
  8.  
  9. } PyDictEntry;  
  1. typedef struct _dictobject PyDictObject; 
  2.  
  3. struct _dictobject { 
  4.  
  5.     PyObject_HEAD 
  6.  
  7.     Py_ssize_t ma_fill; 
  8.  
  9.     Py_ssize_t ma_used; 
  10.  
  11.     Py_ssize_t ma_mask; 
  12.  
  13.     PyDictEntry *ma_table; 
  14.  
  15.     PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash); 
  16.  
  17.     PyDictEntry ma_smalltable[PyDict_MINSIZE]; 
  18.  
  19. };  

字典初始化

字典在初次创建时将调用PyDict_New()函数。这里删掉落了源代码中的部分行,并且将C说话代码转换成了伪代码以凸起个中的几个关键概念。

  1. returns new dictionary object 
  2.  
  3. function PyDict_New: 
  4.  
  5.     allocate new dictionary object 
  6.  
  7.     clear dictionary's table 
  8.  
  9.     set dictionary's number of used slots + dummy slots (ma_fill) to 0 
  10.  
  11.     set dictionary's number of active slots (ma_used) to 0 
  12.  
  13.     set dictionary's mask (ma_value) to dictionary size - 1 = 7 
  14.  
  15.     set dictionary's lookup function to lookdict_string 
  16.  
  17.     return allocated dictionary object  

添加项

添加新的键/值对调用的是PyDict_SetItem()函数。函数将应用一个指针指向字典对象和键/值对。这一过程中,起首会检查键是否是字符串,然后计算哈希值,如不雅先前已经计算并缓存了键的哈希值,则直接应用缓存的值。接着调用insertdict()函数添加新键/值对。如不雅晃荡槽和空槽的总数跨越数组长度的2/3,则需调剂数组的长度。为什么是 2/3 ?这主如果为了包管探测序列可以或许以足够快的速度找到余暇槽。后面我们会介绍调剂长度的函数。

  1. arguments: dictionary, key, value 
  2.  
  3. returns: 0 if OK or -1 
  4.  
  5. function PyDict_SetItem: 
  6.  
  7.     if key's hash cached: 
  8.  
  9.         use hash 
  10.  
  11.     else
  12.  
  13.         calculate hash 
  14.  
  15.     call insertdict with dictionary object, key

      推荐阅读

      如何算出精确的PUE?连续监测才是王道

    PUE申报精度电力应用效力(PUE)是一个评价数据中间能源效力的通用指标,是数据中间消费的所有能源竽暌闺IT负载应用的能源之比。PUE能赞助数据中间经理有效地治理能耗设备。计算某数据中间举措措施的PUE值有很多原因,>>>详细阅读


    本文标题:深入Python字典的内部实现

    地址:http://www.17bianji.com/lsqh/35357.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)