Python中单个字节的内存开销解析:为何bytes(1)占用34字节?
Python中单个bytes对象的内存开销解析
当你运行sys.getsizeof(bytes(1))得到34字节时,这个结果是整个Python bytes对象的总内存占用,而非仅存储的1字节数据。Python中所有值都是对象,必须携带运行时管理所需的元数据,这就是额外开销的核心原因。
内存开销的具体构成(以64位CPython为例)
bytes对象基于PyBytesObject结构体实现,开销分为两部分:
- 核心元数据开销:
- 引用计数(
ob_refcnt):8字节,用于自动内存管理,跟踪对象被引用的次数 - 类型指针(
ob_type):8字节,标识该对象是bytes类型,支持Python的动态类型系统 - 长度字段(
ob_size):8字节,记录字节序列的长度,避免遍历计算 - 哈希缓存(
ob_shash):8字节,预存对象的哈希值,提升字典、集合等操作的效率
- 引用计数(
- 数据存储与对齐:
实际存储1字节的数据,但64位系统要求内存按8字节对齐,因此会额外分配1字节的填充空间,确保总大小符合对齐规则。
把这些加起来:8+8+8+8+1+1=34字节,这就是sys.getsizeof返回的结果。
更接近"裸字节"的存储方式
如果想最小化单字节的内存开销,可以使用更轻量的类型:
- 使用
array模块:array.array('B', [0]),其sys.getsizeof结果约为56字节(仍有对象开销,但比bytes小) - 使用
ctypes模块:ctypes.c_ubyte(0),sys.getsizeof结果约为28字节,更接近裸字节的存储方式
但要注意,Python中不存在完全无开销的裸字节类型,所有值都需要作为对象存在以兼容Python的运行时机制。
内容的提问来源于stack exchange,提问作者João Pedro Schmitt
相关产品推荐
相关产品推荐

