You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《流畅的Python》结论与实测矛盾:Python array为何比List内存占用更高?

为什么测试中Python array的内存占用反而比List高?

这个问题确实挺反直觉的,毕竟《流畅的Python》明确说array像C数组一样精简,那咱们来拆解可能的原因:

1. 你可能用错了内存测量方式

最常见的坑是只用sys.getsizeof()来对比,但这个函数只返回对象自身的内存大小,不包含它引用的元素的内存:

  • 对于List来说,sys.getsizeof(L)只算了列表结构体本身+存储指针的数组的大小,而每个列表元素指向的独立float对象(在CPython里每个float对象占24字节左右)的内存没被统计进去。
  • 对于array来说,sys.getsizeof(floats)已经包含了所有原始double数据的内存(因为array直接存储原始数值,不是指针)。

如果只看这个数值,可能会误以为array占内存更多,但算上List所有元素对象的总内存,List的开销会比array大得多。

2. 初始化方式带来的临时内存波动

你的测试代码里,array用的是生成器表达式(random() for i in range(10**7))初始化,而List用的是列表推导式[random() for i in range(10**7)]。在初始化过程中,生成器会逐个生成元素传给array,而列表推导式会一次性创建所有元素。如果你的内存测量是在初始化过程中做的(比如用工具实时监控),可能会捕捉到临时的内存峰值差异,但这不是最终的稳定内存占用。

3. array的结构体开销确实比List略大,但可忽略不计

CPython里,array.array对象的结构体比list的结构体多了一些字段(比如存储类型码、元素大小等信息),这点额外的开销对于10^7级别的元素来说,几乎可以忽略,不会导致整体内存占用超过List。

验证正确内存占用的方法

你可以用更全面的工具来测量,比如pympler库的asizeof函数,它会递归计算对象及其引用的所有内存:

import array
from random import random
from pympler import asizeof

floats = array.array('d', (random() for i in range(10**6)))
L = [random() for i in range(10**6)]

print(f"Array总内存: {asizeof.asizeof(floats) / 1024 / 1024:.2f} MB")
print(f"List总内存: {asizeof.asizeof(L) / 1024 / 1024:.2f} MB")

运行这个代码,你会看到List的总内存远高于array,完全符合《流畅的Python》里的结论。

补充一下:书中说的"Python array is as lean as a C array",指的是它的元素存储方式和C数组一样是连续的原始数据,没有List里每个元素都是独立对象的额外开销,这才是它内存高效的核心。

内容的提问来源于stack exchange,提问作者yoyoyoyo123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:01