orjson:一个比标准库快 10 倍的 Python JSON 库

orjson 在 GitHub 上已有 8,097 个 Star。

这是一个用 Rust 编写的 Python JSON 库,目标很明确:比标准库更快、更正确地处理 JSON。

正文顶部截图

1、标准库的短板

Python 内置的 json 模块足够应付日常,但一旦数据量上去、类型复杂起来,瓶颈就出来了。

标准库不原生支持 datetimeUUIDnumpy.ndarray 这类常见类型,碰到就得手动写转换逻辑。序列化大对象时,速度也往往拖后腿。

2、orjson 快在哪里

orjson 的 dumps() 序列化速度约为标准库的 10 倍,loads() 解析速度约为 2 倍。它严格遵循 UTF-8 和 RFC 8259,不会为了追求速度牺牲正确性。

这些类型它原生支持序列化:

  • dataclasses.dataclass
  • datetime.datetimedatetime.datedatetime.time
  • uuid.UUID
  • numpy.ndarray
  • enum.Enum

不需要手写转换函数,直接丢进去就行。

输出是 UTF-8 编码的 bytes 对象。序列化过程中 GIL 被全程持有,对纯 Python 调用者来说是透明的。

3、安装与使用

通过 PyPI 安装:

pip install "orjson >= 3.10,<4"

也可以在 pyproject.toml 里指定:

orjson = "^3.10"

快速示例:

import orjson, datetime, numpy

data = {
    "type": "job",
    "created_at": datetime.datetime(1970, 1, 1),
    "payload": numpy.array([[1, 2], [3, 4]]),
}

orjson.dumps(data, option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY)
# b'{"type":"job","created_at":"1970-01-01T00:00:00+00:00","payload":[[1,2],[3,4]]}'

注意 orjson.dumps() 返回的是 bytes,不是 strdict 的键如果不是字符串,需要加 option=orjson.OPT_NON_STR_KEYS。缩进通过 OPT_INDENT_2 控制,标准库的 indent 参数在这里被替换为选项位。

4、平台支持

orjson 支持 CPython 3.10 到 3.15,提供 Linux、macOS、Windows 的预编译 wheel,覆盖 amd64、aarch64、arm7、ppc64le、s390x 等架构。amd64 版本在运行时会自动检测 AVX-512 指令集来提速。

它不支持 PyPy 和 Android、iOS 的嵌入式 Python。

README区域截图

5、适合哪些人

  • 需要处理大量 JSON 数据的后端服务开发者
  • 使用 dataclassnumpydatetime 较多的数据工程场景
  • 对序列化性能有明确要求的项目

如果你现在的 JSON 处理已经成为性能瓶颈,替换为 orjson 通常是最快的优化路径。

较多的数据工程场景

  • 对序列化性能有明确要求的项目

如果你现在的 JSON 处理已经成为性能瓶颈,替换为 orjson 通常是最快的优化路径。

更多推荐