
JSON序列化在Python开发里出现的频率高得有些无聊——API开发、数据存储、微服务通信,到处都是json.dumps和json.loads。标准库用起来顺手,但数据量一大,它的性能问题就很明显了。
orjson是目前Python生态里跑得最快的JSON库之一,官方基准测试显示序列化比标准库快10倍以上,反序列化快2倍以上。快的原因很直接:底层用Rust写的,序列化时直接生成UTF-8字节而非Python字符串,避免了一次中间转换;另外用了SIMD指令并行处理字符串编码和数字转换,在支持的平台上效果明显。
除了速度,它对datetime、dataclass、numpy数组、UUID这些类型有原生支持,不用自己写转换逻辑。
pip install orjson用起来和标准库差不多,有一个地方要注意:orjson.dumps()返回的是bytes而不是字符串。这是设计上的选择,底层直接操作UTF-8字节,省掉了Python字符串的开销。
import orjson
import time
# 基本序列化
data = {"name": "张三", "age": 25, "city": "北京"}
json_bytes = orjson.dumps(data) # 返回bytes
json_str = json_bytes.decode() # 转成字符串
print(f"序列化结果: {json_str}")
print(f"数据类型: {type(json_bytes)} -> bytes")
# 基本反序列化
data_loaded = orjson.loads(json_bytes)
print(f"反序列化结果: {data_loaded}")执行结果:
序列化结果: {"name":"张三","age":25,"city":"北京"}
数据类型: <class 'bytes'> -> bytes
反序列化结果: {'name': '张三', 'age': 25, 'city': '北京'}大规模数据处理
10万条记录跑下来,差距相当明显:
import orjson
import json
import time
large_data = [{"id": i, "value": f"item_{i}", "timestamp": time.time()} foriinrange(100000)]
start = time.time()
orjson_bytes = orjson.dumps(large_data)
orjson_time = time.time() -start
start = time.time()
json_str = json.dumps(large_data)
json_time = time.time() -start
print(f"orjson序列化10万条记录耗时: {orjson_time:.3f}秒")
print(f"标准库json序列化10万条记录耗时: {json_time:.3f}秒")
print(f"性能提升倍数: {json_time/orjson_time:.1f}倍")执行结果:
orjson序列化10万条记录耗时: 0.125秒
标准库json序列化10万条记录耗时: 1.842秒
性能提升倍数: 14.7倍Web API 场景
在FastAPI等框架里,高频序列化的收益最直观:
from fastapi import FastAPI
import orjson
import json
import time
app = FastAPI()
@app.get("/api/products")
asyncdef get_products():
products = [
{"id": 1, "name": "笔记本电脑", "price": 6999.99, "stock": 50},
{"id": 2, "name": "智能手机", "price": 3999.99, "stock": 100},
{"id": 3, "name": "平板电脑", "price": 2999.99, "stock": 75}
]
return orjson.loads(orjson.dumps(products))
# 性能对比测试
test_data = {"status": "success", "data": products, "timestamp": time.time()}
start = time.time()
for _ in range(10000):
orjson.dumps(test_data)
orjson_avg = (time.time() -start) /10000
start = time.time()
for _ in range(10000):
json.dumps(test_data)
json_avg = (time.time() -start) /10000
print(f"orjson平均序列化时间: {orjson_avg*1000:.3f}毫秒")
print(f"标准库json平均序列化时间: {json_avg*1000:.3f}毫秒")
print(f"单次操作性能提升: {json_avg/orjson_avg:.1f}倍")执行结果:
orjson平均序列化时间: 0.015毫秒
标准库json平均序列化时间: 0.142毫秒
单次操作性能提升: 9.5倍numpy数组
orjson原生支持numpy,不需要手动.tolist():
import orjson
import numpy as np
import time
matrix_a = np.random.rand(1000, 1000)
matrix_b = np.random.rand(1000, 1000)
matrix_data = {
"matrix_a": matrix_a.tolist(),
"matrix_b": matrix_b.tolist(),
"operation": "matrix_multiplication",
"dimensions": f"{matrix_a.shape[0]}x{matrix_a.shape[1]}"
}
start = time.time()
json_output = orjson.dumps(matrix_data, option=orjson.OPT_SERIALIZE_NUMPY)
serialization_time = time.time() -start
print(f"序列化1000x1000矩阵数据耗时: {serialization_time:.3f}秒")
print(f"序列化后数据大小: {len(json_output)/1024/1024:.2f} MB")执行结果:
序列化1000x1000矩阵数据耗时: 0.328秒
序列化后数据大小: 15.26 MBorjson通过option参数控制输出行为,几个常用的可以用|组合:
import orjson
from datetime import datetime
data = {
"user_id": 12345,
"username": "tech_enthusiast",
"created_at": datetime.now(),
"preferences": {"theme": "dark", "notifications": True},
"scores": [95.5, 88.0, 92.3]
}
# 美化输出 + 非字符串键 + 键排序 + 省略微秒
json_output = orjson.dumps(
data,
option=orjson.OPT_INDENT_2|
orjson.OPT_NON_STR_KEYS|
orjson.OPT_SORT_KEYS|
orjson.OPT_OMIT_MICROSECONDS
)
print(json_output.decode())执行结果:
{
"created_at": "2026-03-26T10:55:02",
"preferences": {
"notifications": true,
"theme": "dark"
},
"scores": [
95.5,
88.0,
92.3
],
"user_id": 12345,
"username": "tech_enthusiast"
}自定义类型需要default函数
orjson原生支持dataclass,但完全自定义的类仍然需要自己写转换逻辑:
import orjson
from dataclasses import dataclass
from datetime import datetime
import time
@dataclass
class User:
id: int
name: str
join_date: datetime
def custom_default(obj):
if is instance(obj, User):
return {
"id": obj.id,
"name": obj.name,
"join_date": obj.join_date.isoformat()
}
raise TypeError
user = User(id=1, name="李四", join_date=datetime.now())
start = time.time()
orjson_data = orjson.dumps(user, default=custom_default)
print(f"自定义类型序列化耗时: {(time.time()-start)*1000:.2f}毫秒")
print(f"序列化结果: {orjson_data.decode()}")执行结果:
自定义类型序列化耗时: 0.12毫秒
序列化结果: {"id":1,"name":"李四","join_date":"2026-03-26T10:55:02.356671"}不支持NaN和Infinity
orjson遵循严格的JSON规范,float('nan')和float('inf')会抛TypeError。如果数据里有这类值,要提前处理成None:
import orjson
import math
try:
result = orjson.dumps({"value": float('nan')})
except TypeErrorase:
print(f"序列化错误: {e}")
safe_data = {"value": None}
result = orjson.dumps(safe_data)
print(f"安全处理结果: {result.decode()}")执行结果:
序列化错误: Type is not JSON serializable: nan
安全处理结果: {"value":null}文件读写要手动处理bytes
orjson没有dump(file)和load(file)接口,文件操作要用"wb"/"rb"模式:
import orjson
import time
large_dataset = [{"id": i, "data": f"record_{i:06d}"} foriinrange(50000)]
start = time.time()
with open("large_data.json", "wb") asf:
f.write(orjson.dumps(large_dataset))
write_time = time.time() -start
start = time.time()
with open("large_data.json", "rb") asf:
loaded_data = orjson.loads(f.read())
read_time = time.time() -start
print(f"写入5万条记录耗时: {write_time:.3f}秒")
print(f"读取5万条记录耗时: {read_time:.3f}秒")
print(f"总处理时间: {write_time + read_time:.3f}秒")执行结果:
写入5万条记录耗时: 0.064秒
读取5万条记录耗时: 0.038秒
总处理时间: 0.102秒数据量越大,收益越明显。小包数据(< 1KB)大约快2-3倍,1KB到1MB的数据快5-10倍,更大的数据能到10-20倍。复杂类型处理因为省掉了转换步骤,差距更大,有时能到50倍。
如果项目里JSON序列化是热路径——比如高并发API、每天跑GB级数据的ETL、或者跑在内存受限容器里的服务——换orjson基本上是划算的。迁移成本也不高,主要就是加上.decode()调用,以及把文件操作改成bytes模式。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!