列表 —— Python 中的动态数组

news/2025/3/26 20:28:37/文章来源:https://www.cnblogs.com/FrostBoy/p/18790782

列表:

在 Python 中,列表(List)是最常用的数据结构之一。它不仅具备动态数组的特性,还通过巧妙的内存管理机制实现了高效的增删操作。本文将从底层原理、使用场景和性能优化三个维度深入解析列表的工作机制。

动态数组的基本概念

动态数组是一种在运行时可以动态调整大小的数组结构。与传统静态数组相比,它通过自动扩容机制避免了固定长度的限制。Python 列表正是这种数据结构的典型实现,其核心优势体现在:

  • 自动内存管理
  • 高效的随机访问
  • 灵活的元素插入 / 删除

动态数组的实现原理

Python 列表的底层结构由三个关键部分组成:

class ListObject {int ob_refcnt;         // 引用计数PyTypeObject *ob_type; // 类型指针int allocated;         // 当前分配的内存大小PyObject     *ob_item; // 元素指针数组
}

当执行 append 操作时,列表会触发扩容逻辑:

  1. 计算新的容量(通常为当前容量的 1.1 倍)
  2. 分配新的内存空间
  3. 复制原有元素到新空间
  4. 释放旧内存

这种预分配策略在保证 O (1) 均摊时间复杂度 的同时,有效减少了频繁扩容带来的性能损耗。

列表操作的性能分析

通过 sys.getsizeof() 函数可以观察到列表的内存占用规律:

import sysa = []
print(sys.getsizeof(a))  # 初始容量为 0 时占用 40 字节
a.append(1)
print(sys.getsizeof(a))  # 容量扩展为 4,占用 72 字节
a.append(2)
print(sys.getsizeof(a))  # 容量仍为 4,占用 72 字节
a.append(3)
print(sys.getsizeof(a))  # 容量扩展为 8,占用 104 字节

常用操作的时间复杂度:

操作类型 时间复杂度 典型场景
索引访问 O(1) 根据位置取值
append O(1) 尾部添加元素
insert O(n) 中间插入元素
pop O(1) 尾部删除元素
del O(n) 中间删除元素

性能优化建议

  1. 预分配容量:当已知元素数量时,使用 [None]*n 初始化列表
  2. 批量操作替代循环:优先使用 extend() 代替多次 append()
  3. 避免中间插入:优先使用 collections.deque 进行两端操作
  4. 列表推导式:比循环构造列表更高效
# 推荐写法
squares = [x**2 for x in range(1000)]# 不推荐写法
squares = []
for x in range(1000):squares.append(x**2)

内存管理机制

Python 采用 分代垃圾回收机制 管理列表内存,当列表被销毁时:

  1. 解除所有元素的引用
  2. 释放 ob_item 数组内存
  3. 回收 ListObject 结构体内存

这种机制确保了内存的高效利用,同时避免了内存泄漏问题。

总结建议

列表作为 Python 的核心数据结构,在大多数场景下都能提供良好的性能表现。当遇到以下情况时,可以考虑使用其他数据结构:

  • 需要频繁的中间插入 / 删除操作 → 使用链表(如双向链表实现)
  • 需要高效的键值对存储 →使用字典(Dict)
  • 需要固定大小的数组 →使用 array 模块

通过理解列表的底层实现,我们可以更高效地使用这一强大工具,在程序性能和开发效率之间找到最佳平衡点。



细节决定成败!
个人愚见,如有不对,恳请斧正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905285.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署高可用 k8s 集群

部署环境:Debian12(bookworm) # 查看 CPU 是否支持虚拟化 grep -E (vmx|svm) /proc/cpuinfo (有输出结果代表支持) # 第一步:安装虚拟化所需软件并启动对应服务 apt updateapt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst # qemu-kvm kvm 虚…

XCVU9P板卡设计原理图:509-U250E 基于VU13P的4路QSFP28光纤PCIeX16收发卡

一、板卡概述基于XCVU9P的4路QSFP28光纤PCIeX16收发卡。该板卡要求符合PCIe 3.0标准,包含一片XCVU9P-2FLGA2014I、4组64-bit/8GB DDR4;4路QSFP28 4X光纤,每路光纤支持4X25Gbps,双向;支持36路IO。板卡工作温度范围0到60℃,板卡设计加工包含散热装置,支持服务器风冷散热。…

Android 创建与跳转

目录:布局代码 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.and…

图像信号处理平台设计原理图:721-基于VU9P的32+8路光纤交换板卡硬件设计

基于TSI721的 PCIe转RapidIO高速数据传输卡 一、板卡概述本卡是基于IDT TSI721桥芯片,用于实现Serial RapidIO(S-RIO) Gen2.1到PCI Express (PCIE) Gen2.1协议转换,将基于RapidIO的对等网络多重处理器集群拓展至x86处理器环境,能够实现基于RapidIO的对等网络多重处理器集群和…

Vue3 路由, Vue router (Part2)

Vue 路由 Vue routerpath: name: component: redirect: children: meta:在Web开发中,特别是在使用Vue.js这类现代前端框架时,经常会涉及到路由和组件的组织方式。你提到的路径(path)、名称(name)、组件(component)、重定向(redirect)、子路由(children)和元信息(m…

浏览器 + AI 插件

浏览器添加 AI 插件,就是给浏览器安装振翅高飞的翅膀。前情概要 我是浏览器的重度使用者,每天的工作几乎都可以在浏览器端完成,所以对浏览器很依赖。碰到浏览器插件,自然都要高看一眼,因为她们可以增强浏览器的功能,昨天看到聚合网站今日热榜中的栏目 “小众软件” 介绍 …

Contest3924 - 计科23级算法设计与分析平时作业-03

题目链接 A.Knight Moves 题面思路 马的bfs、最短路径问题。模板题 示例代码 #include<bits/stdc++.h>using namespace std;#define ll long long //#define int ll #define pii pair<int, int> #define all(x) x.begin(),x.end() #define fer(i, m, n) for(int i …

UML之包含用例

UML提供include机制避免用例重复,实现共享。本文介绍创建被包含用例的步骤,并通过实例展示其在基础用例共享、复杂用例分解及继承用例复用等场景下的应用。对于规模较大的用例,建模过程中经常会发现多个用例存在共享相同的子目标或子行为的情况。为避免重复并实现共享,UML提…

基于ESP32的物联网传感器和超声波距离传感器,Watmonitor可进行实时水位监测

Watmonitor是一个使用物联网传感器进行实时水位监测的自托管应用程序,具有多语言支持和易于访问的数据。Watmonitor是一个多功能的、自托管的web应用程序,专为实时水位监测而设计。使用基于ESP32的物联网传感器和超声波距离传感器,它可以跟踪各种环境中的水位,如水井,水箱…

【Java】【SpringBoot】Quartz——动态任务调度

回顾:前面学习了quartz的基础使用:https://www.cnblogs.com/luyj00436/p/18781141 定时任务可能是按照预设的时间进行。可是实际中,我们肯定希望自由的进行任务生成、暂停、恢复、删除、更新等操作。 Quartz本身没有提供动态调度的功能,需要自己根据相关的API开发。 场景订…

GrapeCity Documents V8.0 新版本特性

GcExcel V8.0 新版本特性丰富,包括:数据导入方面,可从多种数据源(如自定义对象、DataTable 等)导入,为 IRange.ImportData (..) 新增重载;假设分析上,通过 IWorksheet.Scenarios 接口支持 “方案” 功能,可进行多种操作且受保护工作表也能编辑;数据透视表能绑定表格数…