orjson

该怎么选

读/写速度 & 规范性

  • orjson(推荐)

    • 极快的 dumps/loads;对 datetime RFC3339、bytesdataclass 处理好;默认二进制返回 bytes
    • 规范性好(NaN、Infinity 需显式选项)。
  • ujson

    • 也很快,但历史上有边角行为(浮点精度、特殊值处理)。新版改善不少,但整体规范性略逊 orjson。
  • python-rapidjson

    • 速度接近 ujson,选项丰富(精度、NaN 处理、indent、排序等),并支持增量解析接口。

超大文件/低内存(>GB 级)

  • ijson(只读)

    • 流式解析:迭代器逐步产出事件/对象,内存占用极低。
    • 不负责写入;如果要边读边处理,它是首选
  • python-rapidjson 的流式/iter 解析

    • 若你想在一个库里既有常规解析又能做增量解析,它更“一站式”。

数据格式选择(可改格式时更优解)

  • NDJSON/JSON Lines(每行一个 JSON)

    • 便于流式写/读、易并行处理,日志/ETL 友好。
  • Parquet(配合 PyArrow/Pandas)

    • 列式、压缩、统计型工作负载更快更省。
  • MessagePackmsgpack

    • 二进制、高效;但不是 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 更省心。
posted @ 2025-09-03 20:24  X1OO  阅读(43)  评论(0)    收藏  举报