Python 字典实现原理
Python里的实现用了一种被称为散列表
(hash table,也被称为哈希表)的更高效的数据结构。
散列表的核心是散列函数(hashing function,也被称为哈希函数)。散列函数会把键作为参数,然后对它执行一些简单的计算从而生成一个数字。由于计算机上的所有数据最终都按比特(二进制数)存储,因此可以很容易地找到一个合适的散列函数。Python也有一个内置的函数hash来实现这个散列函数。你可以通过下面这样的交互操作来进行尝试:
>>> hash(2)
2
>>> hash(3.4)
922337203685477379
>>> hash(3.4)
922337203685477379
>>> hash('c')
2429946187753368536
>>> hash(None)
8795546022280
>>> hash((1,'spam'))
-5029320327249233509
>>> hash([1,2,3])
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>hash([1,2,3])
TypeError: unhashable type: 'list'
>>>
提供任何“能够被散列”的东西给hash函数都会产生一个int结果
。注意看最后两次交互操作。元组是可以被散列的,但列表则不行
。散列函数的一个要求是,无论何时,调用它去处理特定的对象,它都必须始终计算出完全相同的结果。由于散列函数依赖于对象的底层存储方式来生成散列值,因此在对象的底层存储方式不会发生变化的时候,能够保证这个值是有效的。换句话说,我们只能散列贫血对象(不可变的对象)
。像数字、字符串和元组都是不可变的,因此它们可以被散列。然而,因为列表是可以被修改的,所以Python不允许对它们进行散列操作。
只要有一个合适的散列函数,就可以简单地创建一个散列表来实现字典了
。散列表实际上只是一个用来存储(key, value)键值对的大型列表。然而,这些“对”并不是一个接一个地被顺序存储的,而是会被存储在列表中的散列键所确定的索引处。比如,假设我们分配了一个大小为1000的列表(这就是我们的“表”)。为了存储键值对(“c”,“Clubs”),我们会先计算hash(“c”) % 1000=226。因此,这个元素将会被存储在位置226。在这里,余数操作可以保证我们得到的结果在range(1000)范围内,这个值会是我们表里的一个有效索引。当有一个恰当的散列函数时,元素将会以相对平均的方式分布在整个表格之中
。
只要字典中没有两个键被散列到完全相同的位置,这个实现就会非常高效
。插入一个新元素需要花费常量时间,因为我们只需要应用散列函数,然后把这个元素分配到列表中对应的位置。查找会有类似的复杂性,我们还是先计算散列值,然后我们就能够知道应该去哪里找到元素了。要删除一个元素,我们只需将一个特殊的标记(例如None)放到相应的位置。因此,所有基本的字典操作都可以在常量Θ(1)时间内完成
。
那么,当两个键被散列到同一个位置时会发生什么呢?这种现象被称为碰撞(collision)。现在,你只需要知道已经有很好的技术来处理这个问题就行了。在使用了这些技术并确保有足够大小的表格之后,就可以建立一个允许常量时间操作的数据结构了。所以,Python的词典非常高效,只要你有足够多的可用内存,你就可以轻松地处理成千上万甚至是几百万条条目了。并且,Python解释器本身就在很大程度上依赖于使用字典来维护命名空间,所以字典的实现已经经过了高度的优化
总结
- python字典通过散列表这种数据结构实现
- 列表不能求哈希值
Python 字典实现原理相关推荐
- python字典实现原理-哈希函数-解决哈希冲突方法
python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...
- python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)
字典:(拓展–重要)字典核心底层原理 字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket. 每个bucket 有两部分:一个是键对象的引用,一个是值对 ...
- python字典实现原理_Python字典底层实现原理详解
在Python中,字典是通过散列表或说哈希表实现的.字典也被称为关联数组,还称为哈希数组等.也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值.哈希函数的目的是使键均匀地分布在 ...
- 带你自学Python系列(九):一文读懂Python中字典应用原理!
↑ 点击上方[计算机视觉联盟]关注我们 今天是小编持续更新关于Python的知识总结以及Python实践项目应用的第9天,带你利用零碎时间自学最受欢迎的编程语言之一Python语言.你和小编一起打卡了 ...
- python字典长度可变吗_Python字典dict实现原理
一. 什么是字典? 字典是一系列由键(key)和值(value)配对组成的元素的集合.字典是一个可变容器模型,可以存储任意类型对象.字典实现与哈希算法密不可分(不同的Python版本,算法会不同),不 ...
- Python字典底层实现原理
字典是否是有序 在Python3.6之前,字典是无序的,但是Python3.7+,字典是有序的. 在3.6中,字典有序是一个implementation detail,在3.7才正式成为语言特性,因此 ...
- 倒排索引统计与 Python 字典
2019独角兽企业重金招聘Python工程师标准>>> 最近折腾索引引擎以及数据统计方面的工作比较多, 与 Python 字典频繁打交道, 至此整理一份此方面 API 的用法与坑法备 ...
- 这样合并Python字典,可以让程序的运行效率提高4倍
摘要:在Python中,合并字典有多种方式,通过内建函数.运算符.自定义函数等,都可以完成合并字典的功能,但这些方式,哪些效率低,哪些效率高呢?本文将对这些合并字典的方式进行逐个深度详解,最后会比较这 ...
- python字典添加数组_一步一步学Python3(小学生也适用) 第十三篇: 字典Dict类型
前面我们已经学习了Python的字符串,列表,元组,这一篇我们将学习字典,字典的使用频率是非常高,跟前面几篇一样,只要你用Python编程,就避不开Python字典. 一.创建字典 字典由键(key) ...
最新文章
- Python之文件操作
- workerman连接mysql_workerman Mysql使用
- 高大上的Android沉浸式状态栏?
- 小程序中Cannot read property ‘setData‘ of undefined问题的解决
- [实验]-从汇编代码来看volatile关键字的作用
- rabbitmq异步_在Node.js中使用RabbitMQ和Tortoise进行异步消息传递
- ibm量子计算机应用,科学网—IBM量子计算机获重大突破 可进行百万项计算
- 超逼真AI设计师,谷歌大脑推出新的文本生成图像模型Imagen
- 【Python训练营】Python每日一练----第28天:鲁卡斯队列(round函数用法)
- SystemUI之通知图标控制
- DataSec数据防泄密系统
- 岁月温柔-6 出院后忐忑不安的妈妈
- 【服务计算】第十六周实验报告
- 浙江大学PAT-1003. 我要通过!(20)
- 无线传感网络技术与应用项目化教程(一)
- 提取IEMOCAP情感语料库标签
- php 正则车架号,iOS 车架号、船舶号等正则【原创】
- 【网络教程】如何运用rar压缩软件打包程序,实现安装引导等功能!
- 运维到底是干什么的?看完这篇你就懂了
- 【EAGLE】学习记录1——制板速成
热门文章
- 安装Tensorflow-gpu版本
- “后序遍历二叉运算树进行Lambda演算的化简”带来的联系
- 研究生开学需要准备的事宜(准研究生和保研必看)
- 广西移动计算机面试题,广西移动笔试经验分享
- 开机时设置linux 内核参数 mem,Linux内核开机保留大块内存的方法总结
- linux cpu监控方案,Linux性能优化和监控系列(二)分析CPU性能
- android byte转string_“嵌入式开发学脚本干嘛”之进制/Byte/Hex处理
- 分享一个selenium jar包 的下载地址,各版本都有,包括selenium-server-standalone.jar、selenium、selenium-server
- matlab breline,linebreak_header must be terminated by a line break怎么解决
- java struts2 作用_struts2是什么?如何使用?