python字典

  • 定义
  • 底层实现
  • 查找对比
  • python字典与redis


定义

  1. 无序,可变的容器数据结构,key-value数据存储
  2. key可以为数值,字符串,元组,但是唯一,value则支持多种数据类型
  3. 读取速度快,时间复杂度python字典结构体 python字典的底层数据结构_求余

底层实现

python字典的底层实现是哈希表,即带有索引和存储空间的表
如d={},创建一个空字典,初始化一个长度为8 的C数组arr

1. 插入数据
d["name"]="jack"
首先对键- -“name”计算哈希值,然后对当前C数组arr的长度求余,
得到一个索引值,假如为5,则将当前的(哈希值,键,值)作为一个整体存入arr[5]

2.哈希碰撞
当插入的键,经过哈希计算,求余后若得到与之前一样的索引,比如5,
因此索引处已经存有数据,无法再次存入,那么就将当前的索引+ 一个偏移量,
重新计算索引位置,然后存入数据,这在python中为开放地址法
3. 扩容(可变)
当存入的数据超过总长度的2/3时,字典会成倍扩容,对旧数据根据新数组长度计
算索引,重新存入
4.更新值
d["name"]="tom"
首先计算键- "name"的哈希值,然后对当前数组总长度求余,得到索引,若索引
对应位置的数据的键==“name”,则更新它的值
5.删除
del d["name"]
计算当前键- "name" 的哈希值,求余,找到索引,删除数据,仍保持探测链,
标记此处有过数据

查找对比

列表:遍历所有数据,一个一个的比较,数据量大时,时间复杂度高
字典:对要查找的键,计算哈希值,求余运算得到索引,一步到位,查找效率高

python字典与redis

  1. 哈希碰撞
    python字典–>开放地址法
    redis–>单链法,在相应索引处,垂直引出一个链表节点,存入数据
  2. 扩容
    python字典python字典结构体 python字典的底层数据结构_数据_02,则成倍的扩容,然后对所有的旧数据,重新计算哈希值,对新长度求余数,得到索引,存入数据
    redis哈希,python字典结构体 python字典的底层数据结构_求余_03,则必定扩容,扩容为python字典结构体 python字典的底层数据结构_数据_04,且此值必须第一次超出python字典结构体 python字典的底层数据结构_字典_05,然后渐进式的rehash每个键值对,即每次访问数据的时候,从新计算哈希值,求余,存入索引位置