
JSON序列化在Python开发里出现的频率高得有些无聊——API开发、数据存储、微服务通信,到处都是json.dumps和json.loads。标准库用起来顺手,但数据量一大,它的性能问题就很明显了。
orjson是目前Python生态里跑得最快的JSON库之一,官方基准测试显示序列化比标准库快10倍以上,反序列化快2倍以上。快的原因很直接:底层用Rust写的,序列化时直接生成UTF-8字节而非Python字符串,避免了一次中间转换;另外用了SIMD指令并行处理字符串编码和数字转换,在支持的平台上效果明显。
除了速度,它对datetime、dataclass、numpy数组、UUID这些类型有原生支持,不用自己写转换逻辑。
往期阅读>>>
Python 20 个文本分析的库:效率提升 10 倍的秘密武器
Python 自动化管理Jenkins的15个实用脚本,提升效率
App2Docker:如何无需编写Dockerfile也可以创建容器镜像
Python 自动化识别Nginx配置并导出为excel文件,提升Nginx管理效率
pip install orjson用起来和标准库差不多,有一个地方要注意:orjson.dumps()返回的是bytes而不是字符串。这是设计上的选择,底层直接操作UTF-8字节,省掉了Python字符串的开销。
import orjsonimport time# 基本序列化data = {"name": "张三", "age": 25, "city": "北京"}json_bytes = orjson.dumps(data) # 返回bytesjson_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 orjsonimport jsonimport timelarge_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() -startstart = time.time()json_str = json.dumps(large_data)json_time = time.time() -startprint(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 FastAPIimport orjsonimport jsonimport timeapp = 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) /10000start = time.time()for _ in range(10000):json.dumps(test_data)json_avg = (time.time() -start) /10000print(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 orjsonimport numpy as npimport timematrix_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() -startprint(f"序列化1000x1000矩阵数据耗时: {serialization_time:.3f}秒")print(f"序列化后数据大小: {len(json_output)/1024/1024:.2f} MB")
执行结果:
序列化1000x1000矩阵数据耗时: 0.328秒序列化后数据大小: 15.26 MB
orjson通过option参数控制输出行为,几个常用的可以用|组合:
import orjsonfrom datetime import datetimedata = {"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 orjsonfrom dataclasses import dataclassfrom datetime import datetimeimport time@dataclassclass User:id: intname: strjoin_date: datetimedef custom_default(obj):if is instance(obj, User):return {"id": obj.id,"name": obj.name,"join_date": obj.join_date.isoformat() }raise TypeErroruser = 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 orjsonimport mathtry: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 orjsonimport timelarge_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() -startstart = time.time()with open("large_data.json", "rb") asf:loaded_data = orjson.loads(f.read())read_time = time.time() -startprint(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模式。
