为何Numpy数组复制速度慢于Python列表复制?
为什么numpy.copy()复制小型数组比Python列表复制慢?
我需要多次复制一个约10个元素的小型数组/列表(用于树搜索中的状态存储),追求高效复制,但测试发现numpy.copy()的速度慢于Python的list()函数,原本以为两者速度相当。
测试代码
import time import numpy as np def numPyArrays(iterations:int): initialArray = np.array([1,0,0,1,0,1,1,1,0,0]) for i in range(iterations): nextArray = initialArray.copy() print(f"Numpy Arrays:\n{nextArray}") return def pythonLists(iterations:int): initialList = [1,0,0,1,0,1,1,1,0,0] for i in range(iterations): nextList = list(initialList) print(f"Python Lists:\n{nextList}") return def main(): numIterations = 10000000 startTime = time.time() numPyArrays(numIterations) print(f"Time taken: {round(time.time() - startTime, 2)} seconds.\n") startTime = time.time() pythonLists(numIterations) print(f"Time taken: {round(time.time() - startTime, 2)} seconds.\n") main()
测试结果
Numpy Arrays: [1 0 0 1 0 1 1 1 0 0] Time taken: 4.68 seconds. Python Lists: [1, 0, 0, 1, 0, 1, 1, 1, 0, 0] Time taken: 1.5 seconds.
原因分析
- Numpy数组的额外开销:Numpy数组是带有元数据(如dtype、形状、strides等)的复杂对象,
copy()方法不仅要复制底层数据,还要创建新的数组对象并同步这些元数据。对于仅10个元素的小型数组,元数据操作的开销占比远高于数据复制本身。 - Python列表的轻量复制:Python列表的
list()复制是对现有列表的浅拷贝(这里元素都是不可变整数,等价于深拷贝),列表结构简单,复制时的额外操作极少,在元素数量少的场景下效率优势明显。 - Numpy的设计定位:Numpy的优化重点是大规模数值批量运算,而非单个小型数组的复制操作。这类小数据结构的操作,Python原生列表的表现反而更高效。
场景适配建议
如果始终处理10个元素左右的小型状态存储,继续使用Python列表会更高效;若后续需要对这些状态进行批量数值运算,可以考虑在运算阶段再转换为Numpy数组,平衡复制效率和运算效率。
内容的提问来源于stack exchange,提问作者davo36
相关产品推荐
相关产品推荐

