由于Python内置json模块性能差,Fastapi响应慢,orjson可以显著优化:安装后重写responsee.render()使用orjson.dumps()注意类型兼容,禁止美化选项,并在流式响应中逐步序列化。为什么默许json?.loads()FastAPI响应会减慢
Fastapi默认使用Python内置json模块是序列化的,但它json.loads()和json.dumps()在高并发性或大数据量下明显成为瓶颈。在实测中,当单个响应包含10000条记录,每个包含datetime和嵌套dict时,json.dumps()时间可达300ms以上,CPU占用急剧增加-这不是FastAPI的问题,而是json纯Python实现的固有局限性:无C加速,类型推导费用大,不支持zero-copy内存视图。
换成orjson它是最快有效的优化手段,用Rust编写,原生支持datetime、bytes、dataclass等等类型,输出总是bytes(省去encode步骤)。迁移只需要改变三个地方:
- 安装:
pip install orjson - JSON序列化器取代FastAPI:
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等待标志位控制行为。
Fastapi默认使用Pydantic模型进行响应序列化,而Pydantic模型 v2+已原生支持orjson只要您在模型中使用后端。model_config = {"ser_json_timedelta": "iso8601"}并保证此类配置orjson已经安装,Pydantic内部将自动调用orjson.dumps()而非json.dumps()。但关键点是:
Nodejs Patterns
内容:生产级 Node.js 涵盖后端模式 Express/Fastify 配置、分层架构、中间件、错误处理、验证、数据库集成、身份验证和缓存。 时机:构建 REST API、搭建 Node.js 在实施身份验证、集成数据库、添加验证/缓存或构建后端应用结构时,服务器。 关键词:nodejs, node, express, fastify, typescript, api, rest, 中间件, 身份验证, jwt, 验证, zod, postgres, mongodb, redis, 缓存, 速率限
下载立即学习“Python免费学习笔记(深入);
- 必须使用
BaseModel子类作为response_model,不能直接返回dict -
orjson不支持NaN、Infinity,如遇浮点异常,需提前过滤或使用orjson.OPT_NAN标志 - 如果包含模型字段
SecretStr或IPv4Address确认它们已注册到其他特殊类型orjson在encoder中,否则会抛出TypeError: Type is not JSON serializable
用生成器做流式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()或Pythonaiohttp.ClientSession特别容易出错。