array模块比list省内存近10倍,如一千万个int:list约380MB,array('i')仅约40MB;因array是紧凑C数组,不存对象头、指针和类型信息,但要求类型明确、不支持嵌套或None。

array模块比list省内存多少?array 本质是紧凑的C风格数值数组,不存Python对象头、引用指针和类型信息。存一千万个 int,list 占约380MB,array('i') 只占约40MB——差近10倍。这不是理论值,实测稳定。关键在类型必须明确:'i'(32位有符号整)、'd'(64位浮点)等,不能混存。
注意:array 不支持嵌套或混合类型,也不能存 None 或自定义对象。一旦需要动态类型或复杂结构,就得切回 list 或用 numpy。
怎么选合适的typecode?
选错 typecode 是最常见内存浪费源。比如用 'd' 存温度整数(如25、36),每个值占8字节;改用 'b'(带符号字节)或 'H'(无符号16位)可能只占1或2字节。
-
'b' / 'B':适合 -128~127 或 0~255 的计数、状态码
-
'h' / 'H':适合 -32768~32767 或 0~65535 的传感器原始值、ID偏移量
-
'i':多数整数场景默认选择(但确认你的值真不超过 ±2³¹−1)
-
'f':单精度浮点,比 'd' 节省一半空间,精度损失需评估(如坐标、权重可接受)
'b' / 'B':适合 -128~127 或 0~255 的计数、状态码'h' / 'H':适合 -32768~32767 或 0~65535 的传感器原始值、ID偏移量'i':多数整数场景默认选择(但确认你的值真不超过 ±2³¹−1)'f':单精度浮点,比 'd' 节省一半空间,精度损失需评估(如坐标、权重可接受)别凭感觉选 'd' 图省事——它会默默吃掉双倍内存,且计算未必更快。
array不支持append()以外的增删操作?array 没有 insert()、pop(0)、remove() 等操作。所有「中间插入」或「头部删除」都会触发整体内存搬移,O(n) 时间且易引发意外扩容。
真实场景建议:
- 数据一次性写入后只读?直接用
array.fromlist()或构造时传入序列 - 需频繁尾部追加?
append()安全,内部做了类似list的倍增策略 - 要高效头部/随机插入?别硬扛——要么预分配足够大空间(
array('i', [0]) * N),要么换collections.deque(仅限尾/首)或numpy.ndarray(支持向量化插入但更重)
尤其警惕 += 拼接两个 array:它实际调用 extend(),但若目标 array 容量不足,会重新 malloc + memcpy,比预估更耗时。
和numpy.array相比,什么时候该坚持用array?array 零依赖、启动快、序列化轻(bytes(array) 直出二进制),适合做IO缓冲区、RPC payload、配置缓存。而 numpy.array 带完整数学运算、广播、视图机制,但启动慢、依赖重、序列化需额外处理(如 np.save)。
典型取舍点:
- 只存/读/传原始数值流(如日志采样点、音频PCM帧)→
array - 要算均值、FFT、reshape、与pandas交互 → 直接上
numpy - 已有大量
list数据需临时降内存 → 先试array('d', my_list),失败看是否含非数值或超范围
别为了“看起来更专业”而引入 numpy;也别因“听说 array 快”就把它当万能 list 替代品——它的优势边界非常清晰:纯数值、固定类型、顺序访问、低依赖场景。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











