为什么Python中list的append操作是均摊O(1)的时间复杂度?

P粉602998670

P粉602998670

2026-07-25

674人浏览

原创

append()不是严格o(1)因单次扩容需o(n)重分配,但均摊为o(1),因cpython按new_allocated = (size >> 3) + (size

为什么python中list的append操作是均摊o(1)的时间复杂度?

append() 为什么不是严格 O(1),但能算均摊 O(1)

因为单次 append() 可能触发内存重分配,耗时 O(n),但这种开销被后续多次“免费”追加分摊掉了。

CPython 的 list 底层是动态指针数组,每次扩容不是+1,而是按公式计算新容量:new_allocated = (size >> 3) + (size 。这意味着:

  • 长度为 8 时追加第 9 个元素,容量从 8 扩到 12(+4)
  • 长度为 1000 时追加,容量大约增加 125~130 个槽位
  • 扩容时必须 memcpy 全部旧元素到新地址——这步不可跳过,且是唯一真正 O(n) 的操作
  • 但之后连续 append() 都只改指针和计数,不搬数据

所以 10 万次 append() 实际只扩容约 15 次,总耗时 ≈ 15 次 O(n) 复制之和,除以 10 万,均摊下来接近常数级。

insert(0, x) 为什么永远是 O(n),没法均摊

insert(0, x) 每次都要把全部已有元素往后挪一位,没有缓存、没有预留、没有分摊空间——它每一次都是实打实的 O(n) 搬移。

对一个长度为 10 万的列表执行 insert(0, x),就要复制 10 万个对象引用;执行 1000 次,就是 1000 × 10 万次引用复制,总耗时直接是 O(n²)。

这不是“慢一点”,是算法层面的不可优化:底层内存连续,插头就必须整体平移。

Python 3.14.2
Python 3.14.2

Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。

下载

什么时候 append() 实际变慢?不是理论问题,是规模问题

均摊 O(1) 是理论模型,实际性能受数据规模和使用模式影响明显:

  • 循环中追加百万级元素(如日志行、传感器流)时,扩容次数增多,memcpy 累积延迟可测
  • 对象本身很大(比如含大量属性的自定义类实例),复制引用虽快,但 GC 压力上升,间接拖慢
  • 在内存紧张环境(如容器内存限制),频繁 realloc 可能触发系统级内存整理,放大延迟

此时用 collections.deque 替代 list 是更稳的选择——它的 append() 是真·稳定 O(1),但代价是 my_deque[1000] 访问变成 O(n)。

别把 insert(len(lst), x)append()

虽然 lst.insert(len(lst), x) 语义上等价于 lst.append(x),但 CPython 并不识别这种模式做优化。

它仍会走完整 insert() 路径:检查索引、校验范围、调用通用插入逻辑——哪怕只是挪 0 个元素,也多一层函数调用和分支判断。

实测中,这种写法比原生 append() 慢 10%~20%,且可读性差,容易误导协作者以为你在做特殊位置插入。

真正要注意的,从来不是“能不能用”,而是“为什么这里必须用 list 而不是 deque,以及是否真的需要随机访问”。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1105

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2072

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8844

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1552

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

531

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习