Python 中的 list、tuple、set、dict的底层实现小结

 更新时间:2025年03月20日 09:27:54   作者:星哲最开心  
本文详细介绍了Python中四种常用数据结构——list、tuple、set和dict的底层实现,包括它们的存储方式、性能特点以及适用场景,感兴趣的朋友一起看看吧

在 Python 中,listtuplesetdict 是四种非常常用的数据结构。它们的底层实现各有特点,这些实现方式决定了它们的性能和使用场景。以下是对这四种数据结构底层实现的详细解释:

1. list(列表)

list 是 Python 中最常用的数据结构之一,它是一个 动态数组,用于存储有序的元素集合。

底层实现

  • 存储方式list 是一个 连续的内存块,用于存储元素的引用(指针)。这意味着 list 中的元素可以是任意类型,因为存储的是对象的引用,而不是对象本身。
  • 动态扩展list 的大小是动态的。当列表空间不足时,Python 会分配一个新的更大的内存块,并将旧数据复制到新内存块中。通常,新的内存块大小是当前大小的 1.125 倍(具体倍数可能因 Python 版本而异)。
  • 内存管理:由于 list 是连续内存,因此它支持快速的随机访问(通过索引访问元素的时间复杂度为 O(1))。但插入和删除操作(尤其是非尾部操作)可能需要移动大量元素,时间复杂度为 O(n)。

性能特点

优点

  • 支持快速的随机访问(通过索引)。
  • 内部实现简单,适合存储有序数据。

缺点

  • 插入和删除操作(尤其是非尾部操作)效率较低。
  • 内存占用可能较高,因为需要预留额外空间以支持动态扩展。

2. tuple(元组)

tuple 是一个 不可变的有序集合,用于存储一组固定的数据。

底层实现

  • 存储方式:与 list 类似,tuple 也是通过 连续的内存块 存储元素的引用。不同的是,tuple 是不可变的,这意味着它的大小和内容在创建后不能被修改。
  • 内存分配:由于 tuple 是不可变的,Python 在创建 tuple 时会一次性分配足够的内存来存储所有元素,而不需要考虑动态扩展。
  • 性能优化:由于不可变性,tuple 在某些情况下比 list 更高效,尤其是在作为字典的键或集合的元素时,因为它们的哈希值是固定的。

性能特点

优点

  • 不可变性保证了数据的安全性。
  • 在某些场景下(如作为哈希表的键)比 list 更高效。

缺点

  • 不支持动态修改,灵活性较差。

3. set(集合)

set 是一个 无序的集合,用于存储唯一的元素。它支持高效的成员查找、插入和删除操作。

底层实现

  • 存储方式set 的底层实现是基于 哈希表 的。每个元素通过哈希函数映射到一个唯一的哈希值,并存储在哈希表中。
  • 冲突解决:当两个元素的哈希值冲突时,Python 使用 链表开放寻址法 来解决冲突。具体实现取决于 Python 的版本。
  • 动态扩展:与 list 类似,set 的大小也是动态的。当哈希表的负载因子(元素数量与哈希表大小的比值)超过某个阈值时,哈希表会自动扩展,重新分配更大的内存空间并重新哈希所有元素。

性能特点

优点

  • 成员查找、插入和删除操作的时间复杂度为 O(1)。
  • 自动去重,适合存储唯一元素。

缺点

  • 不支持重复元素。
  • 不支持有序访问。

4. dict(字典)

dict 是一个 键值对的集合,用于存储映射关系。它是 Python 中最强大的数据结构之一。

底层实现

  • 存储方式dict 的底层实现也是基于 哈希表 的。每个键通过哈希函数映射到一个唯一的哈希值,并存储在哈希表中。值则与键关联存储。
  • 冲突解决:与 set 类似,dict 也使用链表或开放寻址法解决哈希冲突。
  • 动态扩展:当哈希表的负载因子超过某个阈值时,dict 会自动扩展,重新分配更大的内存空间并重新哈希所有键值对。
  • 键的唯一性dict 的键必须是不可变类型(如整数、字符串、元组等),因为它们需要支持哈希操作。

性能特点

优点

  • 键值对查找、插入和删除操作的时间复杂度为 O(1)。
  • 支持灵活的键值映射关系。

缺点

  • 键必须是不可变类型。
  • 不支持有序访问(Python 3.7+ 中的 dict 保持了插入顺序,但这不是通过哈希表实现的,而是通过额外的机制)。

总结

数据结构底层实现优点缺点
list动态数组随机访问快,支持动态扩展插入和删除效率低,内存占用可能较高
tuple静态数组不可变,适合哈希不支持动态修改
set哈希表成员查找、插入和删除快,自动去重不支持重复元素,不支持有序访问
dict哈希表键值对查找、插入和删除快键必须是不可变类型,不支持有序访问

扩展阅读

  • Python 官方文档数据模型
  • Python 源码分析:可以参考 Python 源码 中的实现细节,特别是 listobject.ctupleobject.csetobject.cdictobject.c 文件。
  • 性能优化:了解这些数据结构的底层实现可以帮助你更好地选择合适的数据结构来优化代码性能。

如果你对某个数据结构的底层实现有更具体的问题,欢迎继续提问!

到此这篇关于Python 中的 list、tuple、set、dict的底层实现的理解的文章就介绍到这了,更多相关Python list、tuple、set、dict内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Opencv实现计算两条直线或线段角度方法详解

    Opencv实现计算两条直线或线段角度方法详解

    这篇文章主要介绍了Opencv实现计算两条直线或线段角度方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • python中使用PIL制作并验证图片验证码

    python中使用PIL制作并验证图片验证码

    本篇文章给大家分享了python中使用PIL制作并验证图片验证码的具体代码以及说明,需要的朋友参考下吧。
    2018-03-03
  • python中实现迭代器(iterator)的方法示例

    python中实现迭代器(iterator)的方法示例

    我们经常需要遍历一个对象中的元素,在Python中这种功能是通过迭代器来实现的。下面这篇文章主要给大家介绍了python中实现迭代器(iterator)的方法示例,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Pytorch实验常用代码段汇总

    Pytorch实验常用代码段汇总

    这篇文章主要介绍了Pytorch实验常用代码段汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • python结合selenium获取XX省交通违章数据的实现思路及代码

    python结合selenium获取XX省交通违章数据的实现思路及代码

    这篇文章主要介绍了python结合selenium获取XX省交通违章数据的实现思路及代码方法的相关资料
    2016-06-06
  • 采用python实现简单QQ单用户机器人的方法

    采用python实现简单QQ单用户机器人的方法

    这篇文章主要介绍了采用python实现简单QQ单用户机器人的方法,需要的朋友可以参考下
    2014-07-07
  • python 文件下载之断点续传的实现

    python 文件下载之断点续传的实现

    用python进行文件下载的时候,一旦出现网络波动问题,导致文件下载到一半。如果将下载不完全的文件删掉,那么又需要从头开始,如果连续网络波动,是不是要头秃了。本文提供断点续传下载工具方法,希望可以帮助到你
    2021-11-11
  • Python动态语言与鸭子类型详解

    Python动态语言与鸭子类型详解

    这篇文章主要介绍了Python动态语言与鸭子类型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python制作简易聊天器,搭建UDP网络通信模型

    Python制作简易聊天器,搭建UDP网络通信模型

    这篇文章主要介绍了Python制作简易聊天器,搭建UDP网络通信模型,用UDP建立网络模型来完成一个简单的聊天器,感兴趣的小伙伴可以参考一下,希望对你有所帮助
    2022-01-01
  • Python 冷门魔术方法小结

    Python 冷门魔术方法小结

    本文主要介绍了Python 冷门魔术方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04

最新评论