orjson比标准json快,因其用rust编写、原生输出bytes、跳过多余拷贝,并默认支持datetime/dataclass/numpy等类型;而django默认经jsonable_encoder和json.dumps两次处理,开销更大。

直接换 orjson 能显著提速,但不是“一换就快”——它只加速序列化环节,如果瓶颈在数据库、字段冗余或响应体过大,换完仍慢。
为什么 orjson 比 json/django-jsonable_encoder 快
orjson 是用 Rust 写的,原生支持 bytes 输出、跳过 dict → str → bytes 的多次拷贝,且默认处理 datetime、dataclass、numpy 类型,不用额外转换。而 Django 默认走 jsonable_encoder + json.dumps(),中间多出至少两次对象遍历和字符串拼接。
常见错误现象:Response 返回 10MB JSON 耗时 800ms+,其中 600ms 花在 json.dumps() 上(用 cProfile 可验证)。
- 必须确保返回数据是纯 Python 原生类型(
list、dict、int、float、bool、None),orjson不接受自定义类实例 - 不能直接替换
JsonResponse,因为它内部硬编码调用json.dumps();需手动构造HttpResponse -
orjson输出是bytes,Content-Type 必须显式设为"application/json",否则前端可能解析失败
如何在 Django 视图中安全使用 orjson
不推荐全局 monkey patch,容易破坏第三方库(如 DRF 的部分调试功能)。建议按需在特定高性能视图中手动注入。
实操示例:
import orjson
from django.http import HttpResponse
<p>def fast_json_view(request):
data = {"items": list(MyModel.objects.values("id", "name", "score"))}</p><h1>注意:不要传 datetime/Decimal 等非原生类型,orjson 会报错</h1><pre class="brush:python;toolbar:false;">return HttpResponse(
orjson.dumps(data),
content_type="application/json",
)
- 务必提前用
.values()或.values_list()提取字段,避免 ORM 对象进入序列化流程 - 如果数据含
datetime,用orjson.OPT_SERIALIZE_DATETIME选项,但会略降速;更稳做法是提前转成 ISO 字符串 - 避免在
orjson.dumps()前做任何深拷贝或嵌套字典组装,这会吃掉提速红利
orjson 和 DRF 序列化器一起用的坑
DRF 的 Serializer.data 返回的是 ReturnDict,本质是封装过的 dict,orjson 能处理,但若序列化器里用了 SerializerMethodField 或嵌套 Serializer,容易触发惰性求值或重复计算。
- 先调用
serializer.to_representation(instance)获取纯 dict,再喂给orjson.dumps() - 禁用
Serializer的many=True自动包装,自己控制外层结构,避免多一层{"results": [...]} - 别在
to_representation里查库、调 API 或做耗时计算——orjson救不了逻辑层的慢
比换 orjson 更关键的前置优化
很多人换了 orjson 后发现只快了 15%,因为真正卡住的是上游:比如一次返回 20 万条记录,每条带 50 个字段,光数据库 I/O 和内存加载就占了 90% 时间。
- 先用
django-debug-toolbar看 SQL 查询数和耗时,确认是不是 N+1 或全表扫描 - 用
.only("id", "name")或.values()明确指定字段,砍掉 70%+ 无用数据传输 - 单次响应体超过 500KB 就该考虑分页或流式响应(
StreamingHttpResponse+ 分块orjson.dumps()) -
orjson不压缩数据,务必开启 Nginx 或 Gunicorn 的 Gzip,否则网络传输仍是瓶颈
最常被忽略的一点:orjson 加速的是「把 Python 对象变成字节」这一步,但它不减少内存占用、不降低数据库压力、也不缩短网络往返——这些得靠查询精简、索引优化和分页设计来解决。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











