🍪🧁🍧

bytearray和bitmap

这是一个非常完美的总结时刻。为了让你彻底理清这两个概念,我将从内存结构Python实现应用场景三个维度来对比 bytearrayBitmap

简单来说:bytearray 是为了“快”和“通用”,而 Bitmap 是为了极致的“省”


1. 核心区别总览

特性 Python bytearray Bitmap (位图)
定义 Python 内置数据类型 一种数据结构/算法思想 (需自己实现或用库)
最小单位 1 Byte (8 bits) 1 Bit
存储内容 0-255 的整数 只有 0 或 1 (存在/不存在)
内存占用 字节 字节 (省 8 倍内存)
访问速度 极快 () 快 (但在 基础上增加了位运算消耗)
CPU 亲和性 高 (符合 CPU 寻址方式) 低 (CPU 需要额外计算才能读写)

2. 图解内存布局

假设我们要存储状态:ID 0 在,ID 1 不在,ID 2 在 (即 [1, 0, 1])。

Python bytearray 的存法

它是“豪宅”模式。每个 ID 独占一个 8 居室(1 Byte),即使只住 1 个人。

  • 索引 0: 00000001 (值=1) —— 占用 8 bits
  • 索引 1: 00000000 (值=0) —— 占用 8 bits
  • 索引 2: 00000001 (值=1) —— 占用 8 bits
  • 总共: 24 bits (3 Bytes)

Bitmap 的存法

它是“胶囊公寓”模式。8 个 ID 挤在一个房间里,每人只占 1 个床位。

  • 索引 0 (Byte 0): 00000101 (二进制)

  • Bit 0 = 1 (代表 ID 0)

  • Bit 1 = 0 (代表 ID 1)

  • Bit 2 = 1 (代表 ID 2)

  • 总共: 8 bits (1 Byte) —— 实际上这个 Byte 还能再存 5 个 ID


3. 为什么 Python 只有 bytearray 没有内置 bitmap

这是一个经典的“空间换时间”的设计选择。

  1. CPU 寻址限制: CPU 读取内存的最小单位是 Byte。读取 bytearray[5],CPU 一步到位。读取 Bitmap 的第 5 个 bit,CPU 需要先读整个 Byte,再进行位移 (>>) 和与 (&) 运算。
  2. 通用性: bytearray 可以存图片像素、文件流、ASCII 码,不仅仅是布尔值。

总结:Python 赌你的内存够用,所以优先保证速度和通用性。


4. 代码对比

使用 bytearray (简单,稍微费内存)

# 申请 35亿个坑位,每个占 1 Byte
# 内存占用: ~3.3 GB
exists = bytearray(3500000000)

# 标记 ID 100 存在
exists[100] = 1 

# 检查
if exists[100] == 1:
    print("存在")

使用 Bitmap (复杂,极省内存)

Python 没有原生的 bitmap 类型,通常用第三方库 bitarray 或自己用整数位运算模拟。

写法 A:利用 Python 的大整数 (其实就是一个自动扩容的 Bitmap)

# 0 表示全空
bitmap = 0 

# 标记 ID 100 存在
# 原理:把 1 向左移动 100 位,然后做“或”运算
bitmap |= (1 << 100)

# 检查
# 原理:看第 100 位是不是 1
if bitmap & (1 << 100):
    print("存在")

**写法 B:利用第三方库 bitarray**

from bitarray import bitarray

# 申请 35亿个坑位,每个占 1 Bit
# 内存占用: ~400 MB (3.3GB / 8)
bits = bitarray(3500000000)
bits.setall(0)

bits[100] = 1
if bits[100]:
    print("存在")


5. 结合你刚才的 12 位 ID 问题

为什么这两种方案在你 12 位 ID (1万亿) 的场景下都失效了

  • bytearray 方案: 需要 Bytes 1 TB 内存
  • Bitmap 方案: 需要 Bits 125 GB 内存

虽然 Bitmap 省了 8 倍,但 125GB 对于普通计算节点来说依然是不可接受的

结论:

  • 当 ID 范围较小(如 30 亿以内)且连续时:Bitmap 是神
  • 当 ID 范围巨大(如 1 万亿)且稀疏(虽然范围大,但实际只有 18 亿个)时:Hash Set排序数组+二分查找(我们选的方案)是唯一的出路。
posted @ 2026-01-22 16:41  不想吃fun  阅读(2)  评论(0)    收藏  举报