array比list省内存的根本原因是其以连续内存块直接存储同类型原始数值,无python对象头和指针开销;而list存储指向int等pyobject的指针,每个元素额外占8字节,且每个int对象本身约28字节。

array模块比list省内存的根本原因是什么?
因为array只存同类型原始数值,不存Python对象头和引用指针;而list每个元素都是指向PyObject*的指针,哪怕存一个int也要约28字节(CPython 3.12)。比如存一千万个int,用array('i')大概占40MB,用list轻松破200MB。
选对typecode才能真正省空间
typecode错一个,内存反而可能更大。比如本想存0–255的灰度值,用了'i'(4字节有符号整型),实际该用'B'(1字节无符号字节)——空间直接差4倍。
-
'b'/'B':1字节,适合字节流、像素值 -
'h'/'H':2字节,适合音频采样、小范围整数 -
'i'/'I':4字节,通用整数(注意平台差异:Windows下'i'是4字节,Linux/macOS也是,但'l'在64位系统可能是8字节) -
'f'/'d':分别4字节/8字节浮点,别用float对象数组替代
错误示例:array('i', [256]) 不报错,但256超出int32有符号范围(−2³¹~2³¹−1),会静默溢出成 −256 —— 这类越界不会抛异常,得自己校验。
不能直接用array做数学运算,得配合其他工具
array本身不支持+、*、广播、向量化函数。想算均值或逐元素加法,硬写循环反而慢,还失去内存优势。
- 简单聚合(sum/max/min):用内置
sum()或max(),它们对array有优化,比转list快 - 批量计算:转
numpy.ndarray(用np.array(arr, dtype=...)或np.frombuffer(arr, dtype=...)),避免拷贝(后者更省) - 文件IO:用
.tofile()/.fromfile()直接二进制读写,比pickle或JSON快且小得多
陷阱:array('f', [1.1, 2.2]) + array('f', [3.3]) 报TypeError: unsupported operand type(s) —— 拼接得用+=或extend(),不是+。
何时不该用array?
当数据结构需要频繁插入/删除中间元素、混合类型、或依赖list特有方法(如.sort(key=...)、.index()带条件)时,array反而拖慢开发和运行速度。
- append()快,insert(0, x)或pop(50000)极慢(O(n)移动内存)
- 没有
.count()、.remove()等方法,得自己遍历 - 与C扩展交互时才真正发挥优势;纯Python逻辑中,省下的内存常被额外的类型转换开销抵消
最易忽略的一点:array对象本身也有开销(约56字节),存几千个数时,这点固定成本占比不小——别为了省几KB去替换小列表。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











