网站首页 > 技术文章 正文
Python使用FastApi测试;Node.JS使用Fastify;Rust则使用Actix。
选择的Python和Node框架,是在搜索 "最快的<某语言>api "时得到的最高结果;Rust的Actix是一直高度维护的。
测试的基础很简单;在我的MacBook Pro M1上,每个框架处理来自网络服务器的5000个基本 "Hello, World "响应需要多长时间?
我用来运行测试的代码非常简单,显然,我们只关心速度:
Python
客户端代码:
<b>import</b> requests
from requests.adapters <b>import</b> HTTPAdapter
from requests.packages.urllib3.util.retry <b>import</b> Retry
MAX_RETIES = 3
def create_retriable_session():
s = requests.Session()
retries = Retry(
total=MAX_RETIES,
)
s.mount('http:<font><i>//', HTTPAdapter(max_retries=retries))</i></font><font>
s.mount('https:</font><font><i>//', HTTPAdapter(max_retries=retries))</i></font><font>
<b>return</b> s
def main():
s = create_retriable_session()
<b>for</b> _ in range(0, 5000):
s.get(</font><font>"http://127.0.0.1:8000/"</font><font>)
</font>
服务器端,使用fastapi:
from fastapi <b>import</b> FastAPI
app = FastAPI()
@app.get(<font>"/"</font><font>)
async def root():
<b>return</b> {</font><font>"message"</font><font>: </font><font>"Hello World"</font><font>}
</font>
运行服务器:
uvicorn main:app
测试结果:
5.22 s ± 221 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
下面是使用另外一个框架Fastfy使用 异步 后的代码:
<b>const</b> fastify = require('fastify')({logger: false})
<b>const</b> PORT = 8000;
fastify.get('/', async (request, reply) => {
<b>return</b> {message: 'Hello World'}
})
<b>const</b> start = async () => {
<b>try</b> {
await fastify.listen(PORT)
} <b>catch</b> (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
再次测试结果:
4.49 s ± 84.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
比较结果:
FastApi每秒处理约957.85次,Fastfy每秒处理1113.59次。
Rust
use actix_web::{App, get, HttpResponse, HttpServer, Responder};
#[get(<font>"/"</font><font>)]
async fn hello() -> impl Responder {
HttpResponse::Ok().body(</font><font>"{\"message\": \"Hello World\"}"</font><font>)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::<b>new</b>(|| {
App::<b>new</b>()
.serb> express = require('express')
<b>const</b> app = express()
<b>const</b> port = 8000
app.get('/', (req, res) => {
res.json({message: <font>"Hello World"</font><font>})
})
app.listen(port, () => {
console.log(`Example app listening at http:</font><font><i>//localhost:${port}`)</i></font><font>
})
</font>
测试结果:
4.88 s ± 152 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)Rust
use actix_web::{App, get, HttpResponse, HttpServer, Responder};
#[get(<font>"/"</font><font>)]
async fn hello() -> impl Responder {
HttpResponse::Ok().body(</font><font>"{\"message\": \"Hello World\"}"</font><font>)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::<b>new</b>(|| {
App::<b>new</b>()
.service(hello)
})
.bind(</font><font>"127.0.0.1:8000"</font><font>)?
.run()
.await
}
</font>
测试结果:
4.32 s ± 58.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
比较结果:
我们再次看到,Rust比python快,也比Fastify快,Rust能够每秒处理1157.41个请求,每秒比Fastify快44个请求,比FastApi每秒快200个请求。
Node.js
只是为了好玩,Express是最常见的节点框架,所以我也想测试一下,Express比fastify的功能更全面,所以我估计它也会更慢。
<b>const</b> express = require('express')
<b>const</b> app = express()
<b>const</b> port = 8000
app.get('/', (req, res) => {
res.json({message: <font>"Hello World"</font><font>})
})
app.listen(port, () => {
console.log(`Example app listening at http:</font><font><i>//localhost:${port}`)</i></font><font>
})
</font>
测试结果:
4.88 s ± 152 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
而且确实比fastify要慢。
结论
Rust绝对是最快的选择,但它是最好的吗?我不确定我是否能回答这个问题,因为98%的情况下这要取决于。你的团队知道什么?该框架有你需要的功能吗?如果没有,你能建立它吗?如果你没有一个专家团队,学习起来有多容易?该框架在4-5年内存在的可能性有多大?
这些测试有一些注意事项,它们是在Python中运行的,所以它们只能以Python发出请求的速度运行,而且它们不是多线程的,所以框架也可能不会使用多线程来响应,这取决于Python请求库中的会话工作方式。另外,一般来说,node是单线程的,node用队列来伪造并发,但是有一种方法可以解决这个问题,那就是用workers,它允许你在不同的线程上运行多个服务器,这取决于CPU有多少逻辑核心,这在生产中非常有用,因为它有巨大的性能提升,但同样,这些测试不能从中受益。
这篇文章的重点不是让你转到Actix/Rust的生产服务器上,重点是展示我在学习新东西时喜欢的一种简单的方法,并希望展示测试并不总是要严肃或复杂。
- 上一篇: Python - 爬虫之Selenium
- 下一篇: 代码示例:Python 调用并执行 JS
猜你喜欢
- 2024-12-25 Python 标准库中鲜为人知的宝藏 | Node.js 22.8.0 发布
- 2024-12-25 Python连接数据库的三种方式
- 2024-12-25 Python入门学习记录之一:变量
- 2024-12-25 Python之Json模块详解
- 2024-12-25 告别重复工作,Python操作xlwings实例演示
- 2024-12-25 (新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
- 2024-12-25 (新版)Python 分布式爬虫与 JS 逆向进阶实战无mi-朝朝暮暮
- 2024-12-25 Python字符串总结
- 2024-12-25 python 爬虫调用 js 的库之 execjs
- 2024-12-25 代码示例:Python 调用并执行 JS
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)