
本文介绍一种比 orjson 更快的布尔值列表序列化方案:直接利用 Python 的 bytes/bytearray 构造器进行无损编解码,无需额外元数据,适用于 [1, 0, 0, 1] 类型的二进制整数序列。
本文介绍一种比 orjson 更快的布尔值列表序列化方案:直接利用 python 的 bytes/bytearray 构造器进行无损编解码,无需额外元数据,适用于 `[1, 0, 0, 1]` 类型的二进制整数序列。
在高性能数据处理场景中,频繁序列化短小的布尔值列表(如 [1, 0, 0, 1, 1, 0])时,通用 JSON 库(如 orjson)虽已高度优化,但仍存在解析开销、字符串编码/解码及结构化元数据(如方括号、逗号、数字字符)的冗余。若业务允许将布尔值统一映射为 0/1 整数(即 True→1, False→0),可绕过文本协议,直接使用 Python 原生字节对象实现零拷贝级的高效转换。
核心思路是:将整数列表视为字节序列的原始值——因每个元素均在 [0, 255] 范围内,完全兼容 bytes() 和 bytearray() 构造器。序列化即 bytes(lst),反序列化即 list(b),全程无编码、无解析、无中间字符串生成。
以下是可直接运行的对比示例:
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)) # ✅ 序列化:list → bytes;反序列化:bytes → list
def serialize_deserialize_bytearray(a):
return list(bytearray(a)) # ✅ 更优:bytearray 构造略快于 bytes
# 测试数据(长度为 40 的 0/1 列表)
a = [1, 0, 0, 1] * 10
for func in [serialize_deserialize_json,
serialize_deserialize_bytes,
serialize_deserialize_bytearray]:
elapsed = timeit('func(a)', globals=globals(), number=1000000)
print(f"{func.__name__:30} {elapsed:.6f}s")典型基准结果(Python 3.11, macOS M2):
serialize_deserialize_json 0.779s serialize_deserialize_bytes 0.620s serialize_deserialize_bytearray 0.493s ← 最快,提速约 36% vs orjson
⚠️ 注意事项:
-
输入约束:仅支持
int值 ∈[0, 255]。若原始数据含True/False,需先映射:lst = [int(x) for x in bool_list];若含负数或 ≥256 的数,会抛出ValueError。 - 语义等价性:该方法本质是「整数序列的字节级直写」,不保留布尔类型信息,但对纯二值逻辑(如掩码、位图索引)完全足够。
-
内存与可移植性:生成的
bytes对象是紧凑的二进制,但不可读、不可跨语言直接解析(非标准格式);若需持久化存储或跨系统通信,请仍选用orjson/msgpack等标准协议。 -
扩展建议:对于超长布尔数组(如百万级),可进一步结合
array.array('B', lst).tobytes()或 NumPynp.packbits()实现位级压缩(每字节存 8 个布尔值),但会增加反序列化复杂度。
总结:当场景限定于 Python 内部高速传递小型 0/1 列表,且无需元数据与跨语言兼容性时,bytearray(lst) 是目前最轻量、最快捷的序列化路径——它不是“替代 JSON”,而是用对的数据表示匹配对的使用场景。


















