Using orjson to serializing response has a remarkable effect on the speed of fastAPI restful services, specifically for very big objects. As I have read in the official documentation, we can use the response class directly as a parameter of api method. The problem is that when I use the ORJSONResponse
directly as a function it works; however, it doesn't work when passing it into parameter esponse_class=ORJSONResponse
.
ORJSONResponse()
:this code run in 75ms ,size 6.6 MB that shows orjson serialization works properly. It's faster than .net core and it is what I need.
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)
ORJSONResponse
as parameter:this code runs just like without response class set. it takes 876 ms more than 10 times longer in the same 6.6MB size. it shows orjson
has not been set correctly.
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
Test platform
- Test client: ansomnia core 2020.4.1, same results in postman 7.34.0
- Os: MacOS catalina 10.15.7, same results for windows 10
- cpu: core i9
Also, we have documentation for Returning a Response Directly.
So you can use this, not a bad practice.
return ORJSONResponse(content=data)
But this will skip the validation, serialization and automatic documentation, which will give you huge flexibility and performance but which also means, you need to make sure the contents are ready for it and you need to manually design OpenAPI schemas.