Python字典底层实现原理
字典是否是有序
在Python3.6之前,字典是无序的,但是Python3.7+,字典是有序的。
在3.6中,字典有序是一个implementation detail,在3.7才正式成为语言特性,因此3.6中无法确保100%有序。
字典的查询、添加、删除的时间复杂度
字典的查询、添加、删除的平均时间复杂度都是O(1),相比列表与元祖,性能更优。
字典的实现原理
Python3.6之前的无序字典
字典底层是维护一张哈希表,可以把哈希表看成一个列表,哈希表中的每一个元素又存储了哈希值(hash)、键(key)、值(value)3个元素。
enteies = [['--', '--', '--'],[hash, key, value],['--', '--', '--'],['--', '--', '--'],[hash, key, value],
]
带入具体的数值来介绍
# 给字典添加一个值,key为hello,value为word
# my_dict['hello'] = 'word'# hash表初始如下
enteies = [['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],
]hash_value = hash('hello') # 假设值为 12343543 index = hash_value & ( len(enteies) - 1) # 假设index值计算后等于3# 下面会将值存在enteies中
enteies = [['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],[12343543, 'hello', 'word'], # index=3['--', '--', '--'],
]# 继续向字典中添加值
# my_dict['color'] = 'green'hash_value = hash('color') # 假设值为 同样为12343543
index = hash_value & ( len(enteies) - 1) # 假设index值计算后同样等于3# 下面会将值存在enteies中
enteies = [['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],[12343543, 'hello', 'word'], # 由于index=3的位置已经被占用,且key不一样,所以判定为hash冲突,继续向下寻找[12343543, 'color', 'green'], # 找到空余位置,则保存
]
enteies表是稀疏的,随着我们插入的值不同,enteies表会越来越稀疏(enteies也是一个会动态扩展长度的,每一此扩展长度,都会重新计算所有key的hash值),所以新的字典实现就随之出现。
Python3.7+后的新的实现方式
Python3.7+带入数据演示
# 给字典添加一个值,key为hello,value为word
# my_dict['hello'] = 'word'# 假设是一个空列表,hash表初始如下
indices = [None, None, None, None, None, None]
enteies = []hash_value = hash('hello') # 假设值为 12343543
index = hash_value & ( len(indices) - 1) # 假设index值计算后等于3# 会找到indices的index为3的位置
indices = [None, None, None, 0, None, None]
# 此时enteies会插入第一个元素
enteies = [[12343543, 'hello', 'word']
]# 我们继续向字典中添加值
my_dict['haimeimei'] = 'lihua'hash_value = hash('haimeimei') # 假设值为 34323545
index = hash_value & ( len(indices) - 1) # 假设index值计算后等于 0# 会找到indices的index为0的位置
indices = [1, None, None, 0, None, None]
# 此时enteies会插入第一个元素
enteies = [[12343543, 'hello', 'word'],[34323545, 'haimeimei', 'lihua']
]
查询字典
# 下面是一个字典与字典的存储
more_dict = {'name': '张三', 'sex': '男', 'age': 10, 'birth': '2019-01-01'}# 数据实际存储
indices = [None, 2, None, 0, None, None, 1, None, 3]
enteies = [[34353243, 'name', '张三'],[34354545, 'sex', '男'],[23343199, 'age', 10],[00956542, 'birth', '2019-01-01'],
]print(more_dict['age']) # 当我们执行这句时hash_value = hash('age') # 假设值为 23343199
index = hash_value & ( len(indices) - 1) # index = 1entey_index = indices[1] # 数据在enteies的位置是2
value = enteies[entey_index] # 所以找到值为 enteies[2]
时间复杂度
字典的平均时间复杂度是O(1),因为字典是通过哈希算法来实现的,哈希算法不可避免的问题就是hash冲突,Python字典发生哈希冲突时,会向下寻找空余位置,直到找到位置。如果在计算key的hash值时,如果一直找不到空余位置,则字典的时间复杂度就变成了O(n)了。
常见的哈希冲突解决方法:
1 开放寻址法(open addressing)
开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。
2 再哈希法
这个方法是按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数,调用到第一个为空的时候返回不存在,调用到此键的时候返回其值。
3 链地址法
将所有关键字哈希值相同的记录都存在同一线性链表中,这样不需要占用其他的哈希地址,相同的哈希值在一条链表上,按顺序遍历就可以找到。
4 公共溢出区
其基本思想是:所有关键字和基本表中关键字为相同哈希值的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。
Python字典底层实现原理相关推荐
- python的底层实现,Python封装底层实现原理详解(通俗易懂)
事实上,Python 封装特性的实现纯属"投机取巧",之所以类对象无法直接调用以双下划线开头命名的类属性和类方法,是因为其底层实现时,Python 偷偷改变了它们的名称. 前面章节 ...
- python字典实现原理_Python字典底层实现原理详解
在Python中,字典是通过散列表或说哈希表实现的.字典也被称为关联数组,还称为哈希数组等.也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值.哈希函数的目的是使键均匀地分布在 ...
- python字典的实现原理_Python字典的实现原理
以下是自己的学习记录,算是一个总结. 接下来会依次对下面问题做一个解答: 1. Python的dict和set为什么是无序的? 2. 为什么不是所有的python对象都可以用作dict的键和set中的 ...
- Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理
Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理 Python中,判断不可变对象是否相等与Java十分不同. 结论 Python中判断两个字符串相等:既可以使用&q ...
- python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)
通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...
- Python中字典对象实现原理
python中字典对象实现原理 注:字典类型是Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1) 字典是Python的一种可变 ...
- python字典长度可变吗_Python字典dict实现原理
一. 什么是字典? 字典是一系列由键(key)和值(value)配对组成的元素的集合.字典是一个可变容器模型,可以存储任意类型对象.字典实现与哈希算法密不可分(不同的Python版本,算法会不同),不 ...
- python字典实现原理-哈希函数-解决哈希冲突方法
python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...
- Python 字典实现原理
Python里的实现用了一种被称为散列表(hash table,也被称为哈希表)的更高效的数据结构. 散列表的核心是散列函数(hashing function,也被称为哈希函数).散列函数会把键作为参 ...
最新文章
- educoder 使用线程锁(lock)实现线程同步_性能:Lock的锁之优化
- ZooKeeper在HBase集群中的作用
- caffe loss一直nan什么情况
- java销售额查询_用JSP+JavaBean开发模式实现一个销售额的查询
- html5做一个相册_HTML5最新版本介绍
- 阿里云新设浙江猫精人工智能科技有限公司
- java 方法引用_JAVA 8 方法引用 - Method References
- 计算机设备耗材管理系统,实验室耗材管理方法、系统、计算机设备和存储介质与流程...
- CMOS模拟集成电路设计 吴金 学习记录2
- 神奇的夏时令——本来设置好的日期在保存完成后少了一天?
- android app unlock sim pin,android Sim卡锁定 pin解锁流程学习
- Java面试题目分析
- Au:剪辑的基础操作
- SpringBoot整合j2cache缓存
- 33岁跨专业考计算机研究生,盲目跨专业考研考上以后也不轻松
- HTML——表格的基本样式
- 电脑外设(I/O)简介:显示器
- 电脑装双系统有什么坏处?可不只是速度变慢!
- typedef的用法。
- MySQL之表的创建
热门文章
- Tomcat介绍,jdk安装,Tomcat安装
- 多级队列调度算法可视化界面_模拟多级反馈队列调度算法原理(源程序c++)
- smzdm 扫地机器人_千元扫地机器人哪个好?真实测评!
- 多层 JSON 转换成 CSV
- 底盘线控悬架智能化趋势
- 如何理解ROC曲线和AUC值
- 使用pytorch训练你自己的图像分类模型(包括模型训练、推理预测、误差分析)
- 牛客C++面经——给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内
- 关于string.h头文件的函数——C语言
- Animation of CSS3