iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >关于Python字典的底层实现原理
  • 374
分享到

关于Python字典的底层实现原理

Python字典字典底层实现原理Python字典实现原理 2023-02-10 09:02:34 374人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录字典是否是有序字典的查询、添加、删除的时间复杂度字典的实现原理python3.6之前的无序字典带入具体的数值来介绍python3.7+后的新的实现方式Python3.7+带入数据

字典是否是有序

在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 = 1

entey_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 公共溢出区

其基本思想是:所有关键字和基本表中关键字为相同哈希值的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 关于Python字典的底层实现原理

本文链接: https://www.lsjlt.com/news/195459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于Python字典的底层实现原理
    目录字典是否是有序字典的查询、添加、删除的时间复杂度字典的实现原理Python3.6之前的无序字典带入具体的数值来介绍Python3.7+后的新的实现方式Python3.7+带入数据...
    99+
    2023-02-10
    Python字典 字典底层实现原理 Python字典实现原理
  • Java同步关键字synchronize底层实现原理解析
    目录1 字节码层实现1.1 InterpreterRuntime::monitorenter1.1.1 函数参数 JavaThread *thread1.1.2 函数体 2...
    99+
    2024-04-02
  • Javasynchronized底层的实现原理
    目录监视器底层实现执行流程总结前言: 想了解 synchronized 是如何运行的?就要先搞清楚 synchronized 是如何实现? synchronized 同步锁是通过 J...
    99+
    2024-04-02
  • HashMap的底层实现原理
    这篇文章主要介绍“HashMap的底层实现原理”,在日常操作中,相信很多人在HashMap的底层实现原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HashMap的底层实现原理”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-04
  • hashmap底层实现原理
    一、hashmap底层实现原理 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存放,并且允许null键和null值,因为key值唯一(不能重复),因此,null键只有一个。另外,hashmap不保证元素存储的顺...
    99+
    2023-10-29
    底层 原理 hashmap
  • synchronized底层实现原理
    测试类: public class SynchronizedTest {     public void get() {         synchronized (this) { ...
    99+
    2024-04-02
  • 关于python变量的引用以及在底层存储原理
    目录1.变量的引用的底层原理 2.变量的分类 Python的变量,简单来说有数值型,布尔型,字符串类型,列表,元组,字典等6大类。那么不同变量类型在底层是如何存储的,关系到变量的引用...
    99+
    2024-04-02
  • python pow函数的底层实现原理介绍
    一、最朴素的方法和pow比较 python中求两个a的b次方,常见的方法有:pow(a,b),a**b。那么这两个是否有区别,而且他们底层是怎么实现的呢? 最容易想到的方法就是:循环...
    99+
    2024-04-02
  • 浅谈React底层实现原理
    目录1. props,state与render函数关系,数据和页面如何实现互相联动?2. React中的虚拟DOM常规思路改良思路(仍使用DOM)React的思路深入理解虚拟DOM3...
    99+
    2024-04-02
  • python实现字典多层嵌套
    对于字典:dict1={"a":1, "b":2, "c.1":3, "c.2":4, "d.5.2":5, "d.5.3":6, "d.4.1":7}, 将其实现多层嵌套为:dict2={'a': 1, 'b': 2, 'c'...
    99+
    2023-01-31
    嵌套 多层 字典
  • Synchronized的底层实现原理是什么
    Synchronized的底层实现原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1)给静态方法加锁public&n...
    99+
    2024-04-02
  • HashMap的底层实现原理是什么
    这篇文章给大家介绍HashMap的底层实现原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.HashMap的常用方法//  Hashmap存值:----------------------...
    99+
    2023-06-06
  • redis的底层实现原理是什么
    Redis的底层实现原理主要包括以下几个方面: 数据结构:Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。...
    99+
    2024-04-19
    redis
  • chatgpt底层实现的原理是什么
    chatgpt底层实现的原理是通过人工的标注方式来训练出一种强化学习的冷启动模型和reward反馈模型,然后再通过强化学习的模式来学...
    99+
    2023-02-09
    chatgpt
  • Java LinkedHashMap 底层实现原理分析
    目录添加元素 删除元素 更新元素查找元素 其他方法 迭代器总结 在实现上,LinkedHashMap很多方法直接继承自HashMap,仅为维护双向链表覆写了部分方法。所以,要看懂 L...
    99+
    2024-04-02
  • Go WaitGroup及Cond底层实现原理
    目录WaitGroup概念底层数据结构使用方法Cond概念底层数据结构使用方法WaitGroup 概念 Go标准库提供了WaitGroup原语, 可以用它来等待一批 Goroutin...
    99+
    2024-04-02
  • python set()去重的底层原理及实例
    目录set是什么?set特点一、set去重简单实例二、重新set实现机制三、结论四、应用场景需求set是什么? 数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被...
    99+
    2024-04-02
  • Go语言底层原理互斥锁的实现原理
    目录Go 互斥锁的实现原理?概念使用场景底层实现结构操作加锁解锁Go 互斥锁正常模式和饥饿模式的区别?正常模式(非公平锁)饥饿模式(公平锁)Go 互斥锁允许自旋的条件?Go 互斥锁的...
    99+
    2024-04-02
  • 关于InnoDB索引的底层实现和实际效果
    目录一、索引底层实现1.1、局部性原理1.2、B树和B+树二、索引实际效果2.0、准备数据2.1、联合索引和最左前缀匹配2.2、全表扫描一定比使用索引慢?2.3、覆盖索引和回表查询2...
    99+
    2022-12-27
    InnoDB索引 InnoDB索引底层实现 InnoDB索引实际效果
  • Java中SynchronousQueue的底层实现原理剖析
    目录1. SynchronousQueue用法2. SynchronousQueue应用场景3. SynchronousQueue源码解析3.1 SynchronousQueue类属...
    99+
    2022-11-21
    Java SynchronousQueue实现 Java SynchronousQueue原理 Java SynchronousQueue
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作