单个大变量的内存占用是否大于总大小相等的多个小变量之和?
结论
绝大多数情况下,存储N个元素的单个列表a的内存消耗,小于b、c、d三个列表的内存消耗总和,即使三者的元素总数量也为N。
核心原因
- 每个Python列表都有独立的固定基础开销:在主流64位CPython环境中,一个空列表本身就要占用约40字节的内存(不同版本略有差异),这部分开销和列表存储的元素数量无关。
b、c、d会产生3份基础开销,而a只有1份,仅这部分差异就非常明显。 - 列表存储元素的区域本质是指向实际对象的指针数组:64位系统下每个指针占8字节,总元素数都是N的情况下,这部分的内存占用两边完全相等,不会产生差异。
- 动态预分配空间的额外差异:CPython的列表为了优化追加操作的性能,会预分配比实际存储元素更多的冗余空间,预分配的空间大小和列表当前长度正相关。三个列表各自的预分配空间总和,通常也会远大于单个列表的预分配空间。
- 补充说明:如果列表存储的是小整数、驻留字符串这类全局共享的不可变对象,元素本身的内存不会因为拆分到多个列表重复计算,不会影响两者的对比结果。
举个实测参考(64位CPython 3.10环境,暂不计算预分配空间):
当N=6时,长度为6的a总占用为40(基础开销) + 6*8(指针空间) = 88字节
如果b、c、d各存2个元素,单个列表占用为40 + 2*8 = 56字节,三者总占用为56*3 = 168字节,是a的近2倍。
极端特殊情况
几乎不存在a内存消耗更高的场景,唯一可能的例外是a刚触发大幅扩容、冗余预分配空间远大于正常水平,同时b、c、d都是完全没有冗余空间的静态生成列表,但这种场景下两者的差异也极小,远低于基础开销带来的固定差值。
内容的提问来源于stack exchange,提问作者Alex Luque
相关产品推荐
相关产品推荐

