测试实例就用一个简单的json返回进行压测:
Sanic测试程序如下:
from sanic import Sanic
from sanic.response import text
import json
app = Sanic(__name__)
@app.route("/")
async def test(request):
messages = [
{
"role": "system",
"content": "请你扮演一个有20年中小学K12在线教育的老师,给孩子推荐课程。"
},
{
"role": "user",
"content": "请问我需要购买哪些课程。"
}
]
res = json.dumps(messages)
return text(res)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
Sanic测试数据如下:
└─[0] <git:(main f3108d7) > wrk -t8 -c400 -d10s http://localhost:8000/
Running 10s test @ http://localhost:8000/
8 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 5.81ms 5.46ms 171.21ms 99.30%
Req/Sec 9.06k 491.75 11.04k 90.62%
721792 requests in 10.01s, 283.60MB read
Socket errors: connect 0, read 849, write 17, timeout 0
Requests/sec: 72105.18
Transfer/sec: 28.33MB
Flask的测试代码如下:
import json
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
messages = [
{
"role": "system",
"content": "请你扮演一个有20年中小学K12在线教育的老师,给孩子推荐课程。"
},
{
"role": "user",
"content": "请问我需要购买哪些课程。"
}
]
res = json.dumps(messages)
return {"name": res}
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
Flask的测试结果如下:
└─[0] <git:(main f3108d7) > wrk -t8 -c400 -d10s http://localhost:5000/
Running 10s test @ http://localhost:5000/
8 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 29.00ms 32.58ms 286.00ms 96.62%
Req/Sec 529.40 243.40 1.09k 71.05%
16468 requests in 10.07s, 8.56MB read
Socket errors: connect 161, read 24535, write 127, timeout 0
Requests/sec: 1635.05
Transfer/sec: 870.22KB
FastAPI的测试程序如下:
import json
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
messages = [
{
"role": "system",
"content": "请你扮演一个有20年中小学K12在线教育的老师,给孩子推荐课程。"
},
{
"role": "user",
"content": "请问我需要购买哪些课程。"
}
]
res = json.dumps(messages)
return {"name": res}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
请用如下命令启动:
fastapi dev fastapitest.py
fastAPI的测试数据如下:
└─[0] <git:(main f3108d7) > wrk -t8 -c400 -d10s http://localhost:8000/
Running 10s test @ http://localhost:8000/
8 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 81.88ms 30.23ms 392.96ms 89.23%
Req/Sec 610.37 94.68 1.11k 83.62%
48742 requests in 10.05s, 23.20MB read
Socket errors: connect 0, read 1314, write 8, timeout 0
Requests/sec: 4849.82
Transfer/sec: 2.31MB
谁才是王者?
Sanic的QPS:72105.18
Flask的QPS:1635.05
FastAPI的QPS:4849.82
Sanic完美胜出。
Sanic:适合高性能API开发,尤其是高并发,高性能的场景。
Flask:适合小型项目或需要高度定制的场景,灵活性是其最大优势。
FastAPI:适合普通性能 API 开发,尤其是在需要自动生成文档和类型安全的场景下。
最终选择哪个框架,取决于你的项目需求和团队技术栈。 如果你追求快速开发,FastAPI 是不二之选;如果你需要灵活性和自由度,Flask 更适合你;而如果你专注于高性能 API 开发,Sanic 则是你的最佳选择。
参考资料
uvloop: Blazing fast Python networking — magicstack
python 服务也可以很快_sanic flask fastapi 性能对比-优快云博客
Python异步框架大战:FastAPI、Sanic、Tornado VS Go 的 Gin_sanic和fastapi哪个好-优快云博客