
对于仅含 0/1 的布尔型整数列表,无需元数据(如长度)即可实现极致性能的序列化与反序列化——bytearray 构造器方案比 orjson 快约 37%,且零依赖、无编码开销。
对于仅含 0/1 的布尔型整数列表,无需元数据(如长度)即可实现极致性能的序列化与反序列化——`bytearray` 构造器方案比 `orjson` 快约 37%,且零依赖、无编码开销。
在 Python 中处理大量布尔值(例如特征掩码、位图索引或二进制标志序列)时,序列化效率直接影响 I/O 和网络传输性能。若原始数据已规约为 [0, 1, 1, 0, ...] 形式的整数列表(即逻辑布尔值的数值表示),最高效路径并非通用 JSON 序列化,而是直接映射为字节序列。
bytearray 是此场景下的最优解:它将每个整数(必须在 0–255 范围内)视为一个字节,构造过程不涉及编码、解析或对象序列化协议,纯内存拷贝级操作。反序列化时,list(bytearray) 可直接还原为原始整数列表,语义完全一致、无精度损失。
以下为可直接运行的对比示例:
from timeit import timeit
from orjson import dumps, loads
def serialize_deserialize_json(a):
return loads(dumps(a))
def serialize_deserialize_bytes(a):
return list(bytes(a))
def serialize_deserialize_bytearray(a):
return list(bytearray(a))
# 测试数据:长度为 40 的 0/1 列表(模拟中等规模布尔向量)
a = [1, 0, 0, 1] * 10
# 基准测试(各执行 100 万次)
for f in (serialize_deserialize_json,
serialize_deserialize_bytes,
serialize_deserialize_bytearray):
elapsed = timeit('f(a)', globals=globals(), number=1000000)
print(f"{f.__name__:30} {elapsed:.6f}s")
典型输出(Python 3.12,Intel i7):
serialize_deserialize_json 0.779033s serialize_deserialize_bytes 0.620075s serialize_deserialize_bytearray 0.493239s
✅ 关键优势:
-
零序列化开销:
bytearray(a)不生成字符串、不调用编码器,不写入分隔符或括号; -
内存友好:结果为紧凑的
bytearray对象(每元素仅占 1 字节),远优于 JSON 的文本膨胀; -
严格兼容:仅要求输入为
int且 ∈[0, 255]——对布尔上下文完全安全; -
无外部依赖:相比
orjson,原生支持,部署轻量。
⚠️ 注意事项:
- 此法不适用于
True/False布尔对象本身(需先转为int:[int(x) for x in bool_list]); - 输入若含非 0/1 整数(如
2,-1),虽能构造但语义失效,建议预校验; - 若需跨语言互操作或持久化存储,
bytearray的二进制格式缺乏自描述性,此时应权衡性能与可维护性,选用 Protocol Buffers 或 bitarray 等专用方案。
总结:当场景明确限定为「纯 0/1 整数列表」且追求极致吞吐时,bytearray 是目前 Python 生态中最简、最快、最可控的序列化路径——它把问题降维到字节层面,让性能回归本质。










