Python元组与array数组内存占用不符预期的技术疑问
Python元组与array数组的内存占用解析
测试代码与输出
import sys import array a = (1.1, 2.2, 3.3) b = array.array('d', (1.1, 2.2, 3.3)) print(sys.getsizeof(a)) print(sys.getsizeof(b)) print(sys.getsizeof(a[0])) # Output # 64 # 104 # 24
疑问解析
1. 元组内存为何是64字节而非预期的72字节?
你之前的误解在于元组并不存储元素对象本身,而是存储指向元素对象的指针(64位系统下每个指针占8字节)。
Python元组的内存由两部分构成:
- 固定头部开销:包含引用计数、类型指针、元素数量等核心字段,64位Python 3.12中空元组的大小为40字节(可通过
sys.getsizeof(())验证)。 - 元素指针数组:每个元素对应一个8字节的指针,3个元素共占用
3*8=24字节。
总内存计算:40 + 24 = 64字节,与测试结果完全匹配。你之前错误地将元素对象的大小(24字节)直接计入元组内存,实际上元组仅存储指向这些对象的指针。
2. 为何array数组的内存占用比元组更大?
array.array的优势体现在存储大量原始类型数据时,但在元素数量极少的场景下,其对象本身的固定头部开销会抵消原始数据存储的优势:
- array对象的固定头部开销远大于元组:64位Python 3.12中空
array('d')的大小为96字节,比空元组的40字节大很多。 - 少量元素时的内存分配:当仅存储3个double类型元素时,array的头部开销加上原始数据的存储(或内部预分配的小缓冲区)总大小为104字节,超过了元组的64字节。
但当元素数量增多时,array的优势会显现:比如存储1000个double元素,array的总内存(对象+缓冲区)约为96 + 1000*8 = 8096字节;而元组需要存储1000个指针(8000字节)加上1000个float对象(每个24字节,共24000字节),再加上元组头部40字节,总内存达40+8000+24000=32040字节,此时array的内存占用仅为元组的约1/4。
内容的提问来源于stack exchange,提问作者maxbalrog
相关产品推荐
相关产品推荐

