处理 JSON 数据是 Python 开发中的家常便饭,但你有没有遇到过标准库 json 在大数据量下变成性能瓶颈的情况?
orjson 这个第三方库正是为此而生。
它由 Rust 编写,能提供毫秒级的序列化与反序列化速度,尤其在处理 datetime、numpy 数组等特殊类型时表现极为出色。
接下来,咱们通过几段代码,看看它到底有多快。
📊 基本序列化与反序列化
日常开发中最常用的就是 dumps 和 loads。
下面的代码演示了如何使用 orjson 将一个包含中文和数字的字典快速转为 JSON 字符串,再还原回来。
值得注意的是,orjson 默认输出的是 bytes 类型,而非 str,这是为了追求极致的性能。
import orjson
data = {"用户": "小张", "等级": 5, "活跃": True}
# 序列化为 JSON 字节串
json_bytes = orjson.dumps(data)
# 反序列化回 Python 字典
restored_data = orjson.loads(json_bytes)
print(json_bytes)
print(restored_data)
运行结果会显示为紧凑的字节串,然后顺利还原:
b'{"用户":"小张","等级":5,"活跃":true}'
{'用户': '小张', '等级': 5, '活跃': True}
📅 原生支持 datetime
处理时间对象是 Python 里的老大难问题,json 模块遇到 datetime 就会报错,往往需要自己写转换逻辑。
orjson 则将其作为一等公民,直接内置了支持,自动将 datetime 对象转换为 RFC 3339 格式,省去了手动格式化的繁琐步骤。
import orjson
from datetime import datetime
now = datetime.now()
data = {"事件": "登录", "时间戳": now}
# 直接序列化,不会报错
result = orjson.dumps(data)
print(result)
代码可以直接运行,时间会被自动格式化:
b'{"事件":"登录","时间戳":"2025-05-15T10:20:30.123456"}'
🔢 高性能处理 numpy 数组
在做数据分析或机器学习时,经常需要把 numpy 数组转成 JSON 传给前端。
如果用标准库,需要先调 tolist() 方法,既麻烦又低效。
orjson 原生支持 numpy 多维数组,直接将内存数据高速转换为 JSON 列表,大幅提升了数据管道的吞吐能力。
import orjson, numpy as np
arr = np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float32)
data = {"矩阵": arr}
# 一步到位,直接序列化
json_bytes = orjson.dumps(data, option=orjson.OPT_SERIALIZE_NUMPY)
print(json_bytes)
输出结果会将数组转为标准的 JSON 二维列表:
b'{"矩阵":[[1.0,2.0],[3.0,4.0]]}'
⚡ 序列化选项的灵活控制
orjson 提供了丰富的选项来控制输出。
比如,想要输出格式化的、带缩进的 JSON 以便调试,可以传入 OPT_INDENT_2。
下面的代码展示了如何将紧凑的字节输出变成人类更易阅读的美化格式,这对于开发阶段的日志排查非常友好。
import orjson
data = {"名称": "测试", "标签": ["A", "B"]}
# 开启缩进,生成易读格式
beautiful_json = orjson.dumps(
data,
option=orjson.OPT_INDENT_2
)
print(beautiful_json)
输出将不再是挤在一行的文本:
b'{\n "名称":"测试",\n "标签":[\n "A",\n "B"\n ]\n}'
相比于标准库 json 和同样流行的 ujson,orjson 在处理大体积 JSON 时解析速度更快,内存占用更小。
它对 datetime 和 numpy 的原生支持也避免了手写转换代码带来的维护成本。
唯一的不足是它将结果输出为 bytes,且不可扩展自定义类。如果你的项目追求极致效率,尤其在网络传输或日志处理中,orjson 是不二之选。
通过上述实战,我们见识了 orjson 在速度、类型支持和易用性上的明显优势。
在性能敏感的场景下,把 json 替换为 orjson 往往能带来立竿见影的效果。
你平常在项目中遇到最难处理的 JSON 结构是什么样的?欢迎在评论区留言,我们一起探讨更高效的解决思路。