FastAPI响应慢因Python内置json模块性能差,orjson可显著优化:安装后重写Response.render()用orjson.dumps(),注意类型兼容、禁用美化选项,并在流式响应中逐行序列化。

为什么默认json.loads()会拖慢FastAPI响应
FastAPI默认用Python内置json模块做序列化,但它的json.loads()和json.dumps()在高并发或大数据量下明显成为瓶颈。实测中,当单次响应含10万条记录、每条含datetime和嵌套dict时,json.dumps()耗时可达300ms以上,且CPU占用陡增——这不是FastAPI的问题,而是json模块纯Python实现的固有局限:无C加速、类型推导开销大、不支持zero-copy内存视图。
orjson替代json的三步落地法
换成orjson是最快见效的优化手段,它用Rust编写,原生支持datetime、bytes、dataclass等类型,且输出始终是bytes(省去encode步骤)。迁移只需改三处:
- 安装:
pip install orjson - 替换FastAPI的JSON序列化器:
app.json_encoder = orjson.JSONEncoder(不推荐);更稳妥的是重写Response类,覆盖render()方法,直接用orjson.dumps() - 确保所有返回数据可被
orjson处理:避免numpy.ndarray、自定义不可序列化对象;若必须返回,提前转为list或float
注意:orjson不支持default参数,所以别再依赖json.dumps(obj, default=str)这种写法——得显式转换datetime为str,或用orjson.OPT_STRICT_INTEGER等标志位控制行为。
Pydantic模型里嵌入orjson提升序列化效率
FastAPI默认用Pydantic模型做响应序列化,而Pydantic v2+已原生支持orjson后端。只要你在模型里启用model_config = {"ser_json_timedelta": "iso8601"}这类配置,并确保orjson已安装,Pydantic内部就会自动调用orjson.dumps()而非json.dumps()。但关键点是:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
立即学习“Python免费学习笔记(深入)”;
- 必须使用
BaseModel子类作为response_model,不能直接返回dict -
orjson不支持NaN、Infinity,遇到浮点异常需提前过滤或用orjson.OPT_NAN标志 - 若模型字段含
SecretStr或IPv4Address等特殊类型,要确认它们已注册到orjson的encoder中,否则抛TypeError: Type is not JSON serializable
流式响应场景下别硬套orjson.dumps()
当用生成器做流式JSON(如AsyncIterable[Item]),orjson.dumps()无法直接用于逐行yield——因为它返回完整bytes,不是分块流。此时正确做法是:
- 每个yield项单独调用
orjson.dumps(item) + b"\n"(JSON Lines格式) - 禁用
orjson.OPT_INDENT_2等美化选项,减少CPU浪费 - 避免在生成器内做复杂计算或DB查询;流式性能瓶颈常不在序列化,而在yield前的数据准备阶段
最容易被忽略的是:流式接口的客户端必须按行解析,而不是期待一个完整JSON数组——这点在前端用fetch().body.getReader()或Python的aiohttp.ClientSession时尤其容易出错。


















