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

array模块比list省内存的根本原因
因为 array 是连续内存块,只存原始数值(如 int、float),没有 Python 对象头和引用指针;而 list 存的是对象指针,每个元素额外占用 8 字节(64 位系统),还要为每个整数对象分配独立内存(int 对象本身约 28 字节)。100 万个 int 用 list 可能占 10+ MB,用 array('i') 通常不到 4 MB。
选对 typecode 才真正省空间
typecode 决定单个元素字节数,错选会白忙一场。比如读取传感器 16 位 ADC 值(范围 0–65535),该用 'H'(无符号 short,2 字节),而不是默认的 'i'(有符号 int,4 字节)或 'l'(long,8 字节)。
-
'b'/'B':1 字节,适合布尔、小整数 -
'h'/'H':2 字节,足够存大多数计数器、ADC 值 -
'i'/'I':4 字节,通用整数(注意平台差异:Windows 上'i'和'l'都是 4 字节) -
'f':4 字节 float;'d':8 字节 double —— 别盲目用'd',多数场景'f'精度够且省一半内存
错误示例:array('i', [1, 2, 3]) 存小正数 → 改用 array('B', [1, 2, 3]) 内存直接降为 1/4。
array不支持动态扩容,append性能不如list
array.append() 在内部缓冲区满时会 realloc,但不像 list 那样预留增长空间(list 扩容策略是 ~12.5% 预留),所以频繁 append 会导致多次拷贝,反而更慢。适用场景很明确:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
立即学习“Python免费学习笔记(深入)”;
- 数据长度已知 → 先用
array(typecode, iterable)一次性初始化 - 需动态追加但总量可控 → 预估上限,用
array(typecode, [0]) * N预分配,再按索引赋值 - 真要边读边存大量数据 → 考虑先用
list收集,最后转成array(array('f', my_list))
别在循环里反复 append 百万级数据 —— 这时 list 反而更快也更省内存(因预分配策略更激进)。
和NumPy比?别混淆用途
array 模块不是 NumPy 替代品,它没广播、没向量化运算、不支持多维。它的价值是「轻量级紧凑存储」:适合配置缓存、序列化传输、嵌入式数据打包等场景。例如用 struct.pack 把 array('f', data) 直接转 bytes 发送,零拷贝;而 list 必须手动遍历打包,numpy.array 则依赖 C 扩展和额外依赖。
容易被忽略的一点:array 的切片返回新 array,但底层数据不共享 —— 修改切片不影响原数组,这点和 list 一致,但和 numpy.ndarray 的视图行为不同。需要共享内存时,得自己用 memoryview 包一层。


















