orjson比标准json快4倍以上、内存低60%,序列化直接返回bytes,不支持indent/default/datetime直出,需提前转换类型并适配bytes接收逻辑。

json.dumps() 会把整个 Python 对象一次性转成字符串再返回,遇到大型响应(比如含数万条记录的 dict 或嵌套 list)时,不仅内存飙升,还会卡住主线程——这不是“慢”,是根本扛不住。
用 orjson 替代是最快见效的方案,它不返回 str 而是直接输出 bytes,跳过 UTF-8 编码阶段,也省掉中间字符串对象构造。实测 100MB 数据,orjson.dumps() 比 json.dumps() 快 4 倍以上,峰值内存低 60%。
- 安装只需
pip install orjson,Python 3.7+ - 所有输入必须是标准 JSON 可序列化类型(
dict、list、str、int、float、bool、None),不支持自定义类或datetime—— 若需支持,得提前转换 - 输出是
bytes,HTTP 响应中可直接写入response.body,无需再.encode('utf-8') - 不支持
indent或sort_keys等美化参数;如需格式化调试,应仅在开发环境降级用json.dumps(..., indent=2)
ujson 是另一个成熟选择,C 实现、兼容性略好于 orjson(支持部分自定义 default 回调),但速度稍慢、仍不支持 datetime 直出。若你已有 default 处理逻辑,改用 ujson.dumps(data, default=my_encoder) 几乎零迁移成本。
ijson 不适用于“序列化”,它是为反序列化大文件设计的流式解析器,别混淆。你要的是“从 Python 对象 → 流式输出 JSON 字节”,不是“从 JSON 文件 → 流式读取对象”。
json.JSONEncoder 的 iterencode() 方法理论上能生成分块 str,但实际中:
- 每次
next()仍要构造新字符串,无法避免内存拷贝 - 不支持异步写入,无法与
asyncio.StreamWriter配合 - 没有底层 C 加速,性能接近原生
json,无实质优势
真正适合“流式序列化”的路径只有一条:用 orjson.dumps() 得到完整 bytes 后,手动切片分块写入(如 HTTP 分块传输编码),或结合 io.BytesIO + shutil.copyfileobj() 做零拷贝转发。不要试图让序列化过程本身“流式”,那是反模式——序列化本质是确定性计算,强行中断只会引入 bug 和边界判断开销。
最易被忽略的一点:如果你在 FastAPI 或 Starlette 中返回大型 JSON,别用 JSONResponse(content=...),它内部仍走 json.dumps()。应直接返回 Response(content=orjson.dumps(data), media_type="application/json"),绕过框架默认编码链。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











