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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:49:52