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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:11:19