bigywater.tech
Flask · 164

JSON 序列化性能

Flask 返回 JSON 慢在哪?换 orjson 能快多少?datetime 与 Decimal 为什么会拖慢?sort_keys 与 asdict 的代价是什么?这篇把每一环量出来。

7.7 倍
10000 行简单数据:orjson 相对标准库 json.dumps 的速度
7.6 倍
含 datetime 与 Decimal 时 orjson 相对标准库加 default 钩子的速度
15 ms
对 10000 个 dataclass 做 asdict 的耗时,比 json.dumps 本身还慢

标准库的各选项

实测 · 本机执行输出
  json.dumps 默认                       7.07 ms
  json.dumps sort_keys=True           9.32 ms
  json.dumps ensure_ascii=False       7.37 ms
  json.dumps 紧凑 separators            7.06 ms
  orjson.dumps                        0.92 ms
  orjson.dumps + OPT_SORT_KEYS        1.27 ms

上一篇:模板渲染耗时;下一篇:Gunicorn Worker 数量。

第 117 篇从大响应的角度看过一次 orjson,这里把序列化各环节拆开比较。

datetime 与 Decimal

实测 · 本机执行输出
  json.dumps + default 钩子                        16.66 ms
  orjson.dumps(datetime 原生,Decimal 用 default)     2.20 ms
  default 钩子被调用的次数(每行 2 个对象): 20000

Flask 的 JSON provider

实测 · 本机执行输出
  Flask 默认 provider      /plain     9.6 ms | /rich    30.0 ms | /plain 响应 1.11 MB
  orjson provider        /plain     1.0 ms | /rich     2.3 ms | /plain 响应 1.11 MB

对象转 dict 的代价

实测 · 本机执行输出
  dataclasses.asdict    14.5 ms | 手写字典推导   1.4 ms | json.dumps(dict 列表)   7.4 ms | orjson 直接序列化 dataclass 对象   1.2 ms

分步演示

JSON 序列化性能
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。orjson 3.12.0
    • 没有验证:ujson、msgspec 等其它序列化库、pydantic 的 model_dump_json 与 marshmallow 的耗时比较(第 115、116 篇有各自的数字)、数字精度(浮点)的差异、orjson provider 的 loads 在请求解析上的效果
    京ICP备2026067502号-1京公网安备11010502063487号