快如闪电!Astral用Rust重塑Python类型检查


Astral一直在开发这个“用Rust编写的极快的Python类型检查器和语言服务器”,虽然很安静,但已经公开了一段时间。这是PyPI上的第一个alpha公开发布版。

Astral 是一家专注于高性能开发者工具的公司,由 Charlie Marsh 创立(他也是流行的 Python 代码格式化工具 Ruff 的创造者)。Astral 的核心目标是提升 Python 生态系统的工具链性能,尤其是类型检查、代码分析和编辑器支持等方面。

  • Astral 的 Ruff 已经证明了 Rust 在 Python 工具链中的优势(比传统 Python 工具快 10-100 倍)。
  • 类型检查是 Python 开发中的性能瓶颈之一(如 Mypy 较慢),Astral 可能试图用 Rust 解决这一问题。

可以像这样通过uvx尝试:
uvx ty check

与mypy性能比较:
ty运行在大约十分之一秒(0.109总壁时间)使用多个CPU内核:
uvx ty check  0.18s user 0.07s system 228% cpu 0.109 total

在同一个文件夹中运行time uvx mypy .(都是在首先确保底层工具已经缓存之后)花费了大约7倍的时间:
uvx mypy .  0.46s user 0.09s system 74% cpu 0.740 total


背景讨论
大家好像都忘了,Python 处理复杂计算的时候,慢得像老牛拉破车!写网站后台的时候还行,反正卡也是卡在数据库和网速上。但如果你让它干点“体力活”,比如解析代码、处理大文件——Rust/C/Go 直接甩 Python 十条街,快个 10 倍甚至 100 倍都不奇怪!

最近 uv 和 ruff 这些新工具很猛,但 ty(类型检查)还没完全靠谱(我试过,它居然说 datetime.UTC 不存在?离谱!)。不过 Astral 团队(ruff 的开发者)应该能搞定 Python 那些“魔幻现实”问题(没错,Python 的类型系统就是很魔幻)。

为啥大家还在用 mypy?因为它是 Python 写的,而且只有它能管住 Django 那些“魔法方法”(Django 动不动就动态生成代码,别的检查器直接懵圈)。

TypeScript(TS)为啥强? 因为微软砸钱,请了一堆大神,花了十几年时间,把 JavaScript 里各种奇葩写法都研究透了,保证类型检查稳如狗。Python 这边呢?没这待遇! 别的检查器根本没法和 TS 比资源。

为了维护 mypy 等工具的权益,Typescript 汇聚了我们这一代最伟大的人才,他们花了十多年的时间致力于正确地处理每个 JavaScript 文件中出现的各种复杂表单。

微软资助了一支优秀的开发人员团队,致力于解决所有可以想象到的晦涩边缘情况。没有任何其他 Python 检查器能够与 TS 的资源相媲美。


Python的类型系统简直是个"缝合怪"!
就像你本来想造辆自行车,结果东拼西凑最后变成个三轮车还装了个摩托车发动机,骑起来特别别扭。

TypeScript(TS)就好比是专门设计的概念车:先画好完整设计图(整体类型系统),再把发动机(类型检查)和车身(语法)严丝合缝组装起来。就算要拆成JS零件和类型说明书(类型注释文件)也能完美适配。

但Python的类型系统像是给自行车疯狂魔改:

  1. 最开始就随便焊了个菜篮子(类型注释),后来觉得不够用又绑了个滑板当后座(逐步扩展)
  2. 菜篮子不光能装菜还能装宠物(注释功能混乱),搞得类型检查器经常懵逼:"这到底是白菜还是兔子?"
  3. 最坑的是Python自带"魔法道具"——比如继承Enum就像给自行车装隐形的翅膀,看着酷但实际可能摔跟头(TS遇到这种动态类型也头疼)
Python的类型检查就像让体育老师监考数学考试:
  • 有时候看长相就给分(鸭子类型)
  • 有时候又非要查学生证(isinstance名义类型)
  • 考卷还允许用三种不同笔答题(多种实现方式),比如有个叫"重新导出+私有模块"的骚操作,就像把答案写在橡皮上再吞下去...
总之Python这类型系统就是个行走的表情包——"我太难了.jpg",到处都是历史遗留的坑,新功能和老代码打架是家常便饭。