使用orjson序列化响应对fastAPI restful服务的速度有显著影响,特别是对于非常大的对象。正如我在官方文档中所读到的,我们可以直接使用响应类作为api方法的参数。问题是,当我直接使用ORJSONResponse
作为函数时,它是有效的;然而,当将其传递到参数esponse_class=ORJSONResponse
时,它不起作用。
1.直接调用ORJSONResponse()
的示例代码:
这段代码在75ms中运行,大小6.6MB,表明orjson序列化工作正常。它比.net核心更快,这正是我所需要的。
from fastapi import APIRouter
from fastapi.responses import ORJSONResponse
router=APIRouter()
__all__=["router"]
siz=1000000
ret=[None]*siz
for i in range(0,siz-1):
ret[i]=i
@router.get("/planlist"))
def plan_list():
ORJSONResponse(ret)
2.以传递ORJSONResponse
为参数的示例代码:
这段代码就像没有响应类集一样运行。在相同的6.6MB大小下,876ms所需时间要长10倍以上。则表明CCD_ 5没有被正确设置。
from fastapi import APIRouter
from fastapi.responses import ORJSONResponse
router=APIRouter()
__all__=["router"]
siz=1000000
ret=[None]*siz
for i in range(0,siz-1):
ret[i]=i
@router.get("/planlist",response_class=ORJSONResponse)
def plan_list():
for i in range(0,siz-1):
ret[i]=i
return ret
测试平台
- 测试客户端:ansomnia core 2020.4.1,poster 7.34.0中的结果相同
- Os:MacOS catalina 10.15.7,windows 10的结果相同
- cpu:核心i9
此外,我们还有直接返回响应的文档。
所以你可以用这个,这不是一个坏的做法。
return ORJSONResponse(content=data)
但这将跳过验证、序列化和自动文档,这将为您提供巨大的灵活性和性能,但这也意味着,您需要确保内容准备就绪,并且需要手动设计OpenAPI模式。