第一个基于 Radix Tree 进行路由查找的 Python web 框架发布了!

2020-07-25 15:21:28 +08:00
 abersheeran

https://github.com/abersheeran/index.py

经过我和 encode 组织(也就是 starlette / django rest framework 的创造者)的交流,他们并不想把基数树查找纳入 starlette 。

本来如果他们愿意纳入,那么 fastapi 也可以获得基数树路由的加持,性能可以获得再次上升。

现在没办法了,我自己整。之前 index.py 使用的是文件树映射路由,虽然很高效,但是很受限。现在我把基数树纳入路由系统,把 index.py 的路由能力提升一大截,任何风格的路由均可以在里面找到。

无论是喜欢 flask/bottle 这种装饰器路由,还是 Django 这种列表式均可以被 index.py 支持。并且无论再复杂的路由都是在代码加载时展开,不会增加服务的任何运行时开销!

什么叫快,这就是快! 官方文档里我不好写,但是既然是论坛,我就这么说了,index.py 目前应该是所有 Python web 框架里最快的,没有之一。fastapi 快在使用了 ASGI + uvicorn,而 index.py 不仅有这两,而且路由系统更高效。

由于我公司有不少项目已经使用了 index.py ,所以请大家放心。后续应该不会有再像这种的破坏性更改了,并且在我和朋友一起创建的公司倒闭之前,我们都会对这个项目进行维护。

如果不幸,我创业失败,我个人也会接着维护这个框架。这也是我在大学里创造的第一个我很满意的项目,也是最后一个(今年毕业了)。说着说着有点伤感……希望我创业有成,不求深圳一套房,能赚几百万我就心满意足。

欢迎大家来拍砖 https://index-py.abersheeran.com/route/

3472 次点击
所在节点    Python
45 条回复
swulling
2020-07-25 15:22:47 +08:00
有没有 benchmark
abersheeran
2020-07-25 15:25:08 +08:00
@swulling 暂时没这个时间去做,主要是工作忙。周末搞这个,女朋友已经很不满了,待会得陪她出门玩。大佬有兴趣的话,可以帮忙做一下?
BBCCBB
2020-07-25 15:29:34 +08:00
支持. 加油.

starlette 是基于什么方面的考量不想使用 Radix tree 的呢.
BBCCBB
2020-07-25 15:30:56 +08:00
还有就是是不是 fork 一下 starlette 改下路由实现, 然后 fork fastapi 改下依赖来的快些呢?
abersheeran
2020-07-25 15:33:44 +08:00
@BBCCBB 刚翻了一下 gitter.im 被刷下去了,就不截图了。大致是 encode 的其中一个人认为是没必要的,然后我们吵了一会,出来一个支持我的(不是 encode 的人)。还没说两句,我准备提交一个 issue 去正式讨论一番的时候,Tom 出来说 starlette 的路由实现不光以性能为主,简单也很重要。他都发话了,我也没必要挣扎了,就回了一个原来如此。记录你在 gitter 应该都能查到。
abersheeran
2020-07-25 15:35:48 +08:00
@BBCCBB 你想太多了,路由系统是 web 框架最重要的部分,跟其他部件都是强耦合的。你要么重写一个,要么就只能用遍历路由。我觉得小项目其实也还好,执行几十个正则表示式查路由,对于小项目也算不得什么。面对有上千个路由的大项目,starlette(fastapi) 这种遍历就很致命了。
secondwtq
2020-07-25 17:05:24 +08:00
你可以把女朋友换给 V 站大佬,自己就可以安心做 benchmark 了
eudore
2020-07-25 18:07:29 +08:00
Radix 是基操,算不上啥宣传亮点。
est
2020-07-25 18:45:05 +08:00
@BBCCBB 我觉得主要原因是 菜。
AlexaZhou
2020-07-25 18:51:05 +08:00
需要先跑下 benchmark,看现有框架里面,路由查找消耗的时间,占整理处理时间的比例是怎样。

只有在路由查找本身是瓶颈的情况下,这个改进才是有意义的
abersheeran
2020-07-25 21:56:31 +08:00
@eudore 在 Python web 框架里,是首个。虽然我也知道是基操。毕竟我玩了一个晚上就实现完了。
abersheeran
2020-07-25 21:59:36 +08:00
@AlexaZhou ……你这是面对一个已经存在的项目进行分析的路子,不适合于框架。

另外,这个路由优化都不需要我来证明什么,你去看看 golang 的框架,哪个不是 Radix Tree ?
ericls
2020-07-25 22:01:14 +08:00
框架的性能测试无非就是比 overhead 谁小。除非出了大错误,框架带来的 overhead 都不会成为瓶颈
要想速度快的话,不用框架最快。

性能测试还是得看 server 意义大一些
abersheeran
2020-07-25 22:04:01 +08:00
@ericls 是的。只能说同样 uvicorn 下,index.py 的裸性能是比其他 starlette 系(包括 responder/fastapi )快的。但一旦引入业务代码,基本上就看业务代码写的水平了。
ericls
2020-07-25 22:07:04 +08:00
我觉得这个项目还是挺有意思的
abersheeran
2020-07-25 22:11:30 +08:00
@ericls 谢谢~后续文档会越来越详细的,目前文档很粗糙。
newlife
2020-07-25 23:06:58 +08:00
单纯路由映射提升感觉没有多大意义,
abersheeran
2020-07-27 09:52:56 +08:00
@newlife index.py 在很多方面都是和 flask/django 这种传统框架不同的,而也不像 fastapi 这个拼接怪全搬的 starlette 。有更多的便于开发的修改点,你用用就知道了
eudore
2020-07-27 21:22:27 +08:00
@abersheeran 只是有点难以置信,py 发展怎么多年 flask/django 等主流框架居然不是高性能路由匹配,太菜了。。。。
abersheeran
2020-07-28 11:43:32 +08:00
@eudore 我没看过的时候,我也不信。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/693028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX