orjson
该怎么选
读/写速度 & 规范性
-
orjson(推荐)
- 极快的 dumps/loads;对
datetimeRFC3339、bytes、dataclass处理好;默认二进制返回bytes。 - 规范性好(NaN、Infinity 需显式选项)。
- 极快的 dumps/loads;对
-
ujson
- 也很快,但历史上有边角行为(浮点精度、特殊值处理)。新版改善不少,但整体规范性略逊 orjson。
-
python-rapidjson
- 速度接近 ujson,选项丰富(精度、NaN 处理、indent、排序等),并支持增量解析接口。
超大文件/低内存(>GB 级)
-
ijson(只读)
- 流式解析:迭代器逐步产出事件/对象,内存占用极低。
- 不负责写入;如果要边读边处理,它是首选。
-
python-rapidjson 的流式/iter 解析
- 若你想在一个库里既有常规解析又能做增量解析,它更“一站式”。
数据格式选择(可改格式时更优解)
-
NDJSON/JSON Lines(每行一个 JSON)
- 便于流式写/读、易并行处理,日志/ETL 友好。
-
Parquet(配合 PyArrow/Pandas)
- 列式、压缩、统计型工作负载更快更省。
-
MessagePack(
msgpack)- 二进制、高效;但不是 JSON,生态互通性略差。
典型场景建议
- API/服务里常规 JSON(追求速度+规范) → orjson
- 脚本里快速 dump/loads,依赖少 → ujson(或直接用内置
json若足够快) - 处理 10GB 级 JSON(只读遍历/抽取) → ijson
- 既要速度又要可选流式与更多开关 → python-rapidjson
- 日志/海量记录 → NDJSON + 行处理(用标准
json/orjson行读写即可) - 数据分析/仓库 → Parquet(pyarrow/pandas)
最小可用示例
1) ijson 流式读取(大文件友好)
import ijson
with open('big.json', 'rb') as f:
# 假设 big.json 的顶层是数组:[{...}, {...}, ...]
for obj in ijson.items(f, 'item'):
# 每次拿到一个对象,内存占用极低
process(obj)
2) orjson 快速读写
import orjson
data = {"id": 1, "name": "Alice"}
b = orjson.dumps(data) # -> bytes,很快
obj = orjson.loads(b) # 反序列化
# 写文件
with open('data.json', 'wb') as f:
f.write(orjson.dumps(data, option=orjson.OPT_INDENT_2))
3) NDJSON 行写/行读(适合超大集合)
import json
# 写
with open('data.ndjson', 'w', encoding='utf-8') as f:
for i in range(10_000_000):
json.dump({"id": i, "v": f"item-{i}"}, f, ensure_ascii=False)
f.write('\n')
# 读
with open('data.ndjson', 'r', encoding='utf-8') as f:
for line in f:
obj = json.loads(line)
handle(obj)
一句话结论
- 只读大文件:ijson。
- 常规最快且更规范:orjson(优于 ujson)。
- 想统一一个库搞定且要流式:python-rapidjson。
- 数据真大且你能换格式:NDJSON/Parquet 更省心。

浙公网安备 33010602011771号