array.array('i')比list省内存是因为list存储对象指针及int对象头(约28字节/个),而array('i')是连续C整数数组(仅4字节/个);100万整数时list占10–12MB,array仅4MB。

用 array 替代 list 存整数,内存能压到 1/4 甚至更低——但前提是类型选对、数据纯整、不混用操作。
为什么 array.array('i') 比 list 节省内存?
Python 的 list 存的是对象指针,每个 int 对象本身还有额外开销(约 28 字节);而 array.array('i') 是连续的 C 风格 int 数组,每个元素只占 4 字节(32 位有符号整数)。100 万个 int:
-
list约占 10–12 MB(含指针 + 对象头) -
array('i', ...)仅占 4 MB
注意:'i' 对应 C 的 int(平台相关,通常 4 字节),不是 Python 的任意精度 int。超范围会溢出,不报错,只截断。
怎么选对 typecode?常见整数场景对照
typecode 决定底层存储格式和取值范围,选错要么浪费空间,要么 silently 溢出:
立即学习“Python免费学习笔记(深入)”;
- 非负小整数(0–255)→ 用
'B'(unsigned char,1 字节) - 短整数(-128~127)→
'b'(signed char,1 字节) - 常规整数(-2³¹~2³¹−1)→
'i'(最常用,4 字节) - 大整数(需 64 位)→
'q'(signed long long,8 字节),别用'l'(平台依赖) - 千万别用
'L'存无符号大整数——Windows 上是 4 字节,Linux 是 8 字节,移植即崩
查当前平台大小:array.array('i').itemsize,别硬记。
哪些操作会让 array 失去内存优势?
array 是紧凑序列,但一旦触发“对象化”行为,就退化回 list 开销:
- 用
array[i]取单个元素 → 返回 Pythonint对象(没问题,只是取值) - 但用
map(lambda x: x * 2, arr)或列表推导式[x + 1 for x in arr]→ 全部转成int对象,新容器还是list,白省了 - 频繁
.append()小量数据 → 内存重分配比list更慢(array没有 over-allocation 策略) - 混存不同类型(比如塞进一个 float)→ 直接报
TypeError: array item must be integer
真要批量计算,优先用 numpy;若必须纯 stdlib,用 array.fromlist() 批量加载,避免逐个 append。
从文件读写整数时怎么保持低内存?
直接用 array.tofile() 和 array.fromfile(),绕过字符串解析和对象构造:
import array
# 读二进制 int 文件(如 100 万个 'i')
with open('data.bin', 'rb') as f:
arr = array.array('i')
arr.fromfile(f, 1000000) # 一次读完,零中间对象
<h1>写同格式</h1><p>with open('out.bin', 'wb') as f:
arr.tofile(f)对比 json.load() 或 csv.reader():后者每行都要 split、int()、建对象,内存峰值可能翻倍。binary + array 是海量整数 IO 的底线方案。
真正难的不是创建 array,而是全程守住「纯类型」和「避免隐式转对象」这两条线——一不留神,4 MB 的数组就在某个 list(map(...)) 里膨胀回 12 MB。


















