python中dict,set,tuple底层实现原理

本文探讨了Python中dict、set和tuple的底层实现原理,引用了源码链接,并指出其与C/C++及redis实现的相似之处。tuple作为不可变类型,其内部通过常量二级指针实现;dict基于hash表,解决冲突采用链地址法,最新版本已实现插入有序;set作为允许空值的dict,优化了插入和删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码可以在点这里:链接

list的底层实现我已经介绍过了。和我想的类似,里面的元素就是指针

 

最近看了看redis的数据类型的底层实现代码,发现也是用C写的,里面的很多实现真的和python中的实现很类似

果然大佬的思想都是这么强,英雄所见略同哈哈


list和tuple很大的区别就是一个可变一个不可变,可变和不可变的概念我也不介绍了,大家可以自行baidu,简单来说可变就是该地址处的值可以改变,不可变则反之

list被实现为长度可变的数组,每次都会分配略大的内存防止频繁的申请分配内存,连续的一块的内存


tuple:大家可以根据学过的C/C++思考一下是怎么实现的,所以建议学python也要对C要有一定认识

  • 不可改变体现在:本身长度不能变,里面的元素不能变,元素是指针常量不是常量指针,但是元素指向的是一个可变对象如list,那么这个list是可变的,因为list首地址没变,它里面的东西tuple是不知道有没有变得
  • tuple本身为一个结构体,结构体里面有一个二级指针,这是常量二级指针,可以形成一个指针数组而不是数组指针
  • 内部是连续的内存,因为是数组

dict其他语言有的称为map

  • dict的key是不可变对象,因为要确保经过hash算法之后得到的地址唯一
  • 另外,即使字典中的key被remove,但依旧保持这个hash,也就是说,遍历的时候,时间复杂度取决于曾经这个字典拥有的最大键值对的数量
  • 内部构造与redis类似:用桶数组和链表来解决hash冲突(也就是链地址法)
  • 最新的dict已经是insert ordered,原来的话是根据hash值,乱序的,pop不一定是最后一个插入的键值对

set:允许空值的dict

对dict有进行优化,在插入和删除元素的复杂度都将为常数级别,最坏也是O(n)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值