copy.deepcopy 对嵌套列表慢是因为需逐层类型检查、递归调用和缓存管理;二维规整结构应改用列表推导式或 numpy,可提速 2–5 倍并降内存;多数场景无需深拷贝,应按实际变异需求选择浅拷贝或手动隔离。

copy.deepcopy 在嵌套列表上慢,不是因为“写法不对”,而是它根本没打算快——它得为每个子列表、每个字典、每个自定义对象做类型检查、递归调用、memo 缓存管理。你越想保险,它越要多干活。
为什么 copy.deepcopy 对嵌套列表特别拖沓
它不假设你的数据结构是规整的:哪怕你心里清楚这是个 1000×1000 的纯整数二维表,copy.deepcopy 还是得对每个 [...] 判断是不是 list、要不要递归、有没有循环引用、要不要缓存……这些操作全是 Python 层的堆分配和函数调用,没有内存连续性,也没有批量复制能力。
- 实测:1000×1000 的嵌套 list 深拷贝,常耗时 300ms+;同等 NumPy 数组
.copy()在 3–5ms 内完成 - 每个子列表都是独立对象,地址不连续 → CPU 缓存不友好
- 即使元素全是
int,也要反复走isinstance(x, (list, dict, set, ...))
二维/规整嵌套列表:用列表推导式替代 copy.deepcopy
如果你的数据是“所有子列表等长、元素类型一致”的二维结构(比如表格、图像像素、坐标矩阵),根本不需要递归。
- 别写
copy.deepcopy(nested),改用[row[:] for row in nested] - 如果子列表里还有更深一层(比如三维),且深度固定为 3,可用
[[cell for cell in row] for row in nested]或更明确的[[x for x in row] for row in nested] - 比
copy.deepcopy快 2–5 倍,内存占用低 2 倍以上,且不依赖copy模块
能转 NumPy 就别硬扛纯 Python
只要你的嵌套结构是矩形的(每行长度一致)、元素类型统一(如全 int/float),np.array().copy() 是最省心的加速路径。
- 必须用
arr = np.array(nested).copy(),不是np.copy(nested)—— 后者在某些旧版本可能返回视图 - 如果后续还得当 list 用,
arr.tolist()会重新变慢,所以尽量全程用数组操作 - 注意:含
None、混合类型(如[1, "a"])、不等长子列表,会触发dtype=object,失去性能优势
哪些情况其实压根不需要深拷贝
很多人把 copy.deepcopy 当成“防出错开关”无脑开,但多数业务场景根本没那么脆弱。
- 只读副本?直接传原对象,或用
copy.copy()+ 注释说明“禁止修改嵌套项” - 只改顶层(比如替换整个某一行:
new_data[5] = [9, 8, 7])?new_data = old_data.copy()足够 - 只有一两处嵌套需要隔离(比如只改
config["users"][0]["tags"])?手动复制那条路径:config_copy = copy.copy(config); config_copy["users"] = [u.copy() for u in config["users"]] - 原始数据全是不可变对象(
int、str、tuple)?copy.copy()和copy.deepcopy()行为一致,但前者快得多
copy.deepcopy”,而是没想清楚:我到底要隔离哪一层?哪部分数据真会被改?哪部分只是摆设?—— 拷贝策略必须跟着数据变异模式走,而不是跟着“以防万一”走。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











