bytearray和bitmap
这是一个非常完美的总结时刻。为了让你彻底理清这两个概念,我将从内存结构、Python实现和应用场景三个维度来对比 bytearray 和 Bitmap。
简单来说: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?
这是一个经典的“空间换时间”的设计选择。
- CPU 寻址限制: CPU 读取内存的最小单位是 Byte。读取
bytearray[5],CPU 一步到位。读取 Bitmap 的第 5 个 bit,CPU 需要先读整个 Byte,再进行位移 (>>) 和与 (&) 运算。 - 通用性:
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 或 排序数组+二分查找(我们选的方案)是唯一的出路。

浙公网安备 33010602011771号