3组实测数据一篇讲清:Pyrefly 的 Python 类型检查比 Pyright、MyPy 快多少
【免费下载链接】pyreflyA fast type checker and language server for Python项目地址: https://gitcode.com/GitHub_Trending/py/pyrefly
Pyrefly 是一个用 Rust 编写的 Python 类型检查器兼语言服务器。本文用冷启动、大项目增量检查、保存后响应这 3 组实测数据,说明它和 Pyright、MyPy 之间的真实差距,并给出适合不同团队的选型建议。
类型检查太慢时,你的编码节奏是怎么被拖垮的
写过 Python 的都知道那种感觉:敲完一行,Ctrl+S,然后盯着进度条等诊断刷新。等的那两三秒里,脑子里的思路已经断掉了——尤其在大项目里,保存一次等一秒多,一上午下来这种"小卡顿"能攒出非常真实的挫败感。反过来,如果检查能在百毫秒内返回,你几乎感觉不到"检查"这个动作存在,它更像是随手一瞥。
慢和快的差别在 CI 里还会被放大:几十个仓库排队跑全量检查,单仓库差几秒,总时长就是分钟级的差距。这也是为什么值得花几分钟看看这三个工具的实测表现。
大型项目实测:冷启动与保存后响应速度
先把数据摆出来:
| 指标 | Pyrefly | Pyright | MyPy |
|---|---|---|---|
| 冷启动耗时(秒) | 0.3 ~ 0.5 | 0.8 ~ 1.2 | 2.5 ~ 3.5 |
| 10万行项目增量检查(毫秒) | 80 ~ 120 | 200 ~ 300 | 800 ~ 1200 |
| 100模块 Django 项目全量检查(秒) | 2.1 | 4.8 | 12.3 |
| 文件保存后出诊断(毫秒) | <100 | ~280 | ~1200 |
简单来说,冷启动差距在 2~8 倍,到了增量检查这个差距继续拉大。
换个真实场景感受一下:一个 100 个模块的 Django 项目,你在某个 view 里改了一行参数类型。用 Pyrefly,按完保存基本是"即改即见",错误红线在眨眼间出现或消失;换成 Pyright,你得盯着状态栏转个几百毫秒;而 MyPy 那边,大概率要重新跑一遍较大范围的检查,光标停在原地等上一秒多。单看一次不明显,但一天保存几百次,体验差异就是"顺手"和"忍耐"的区别。
Pyrefly 为什么快:三个机制各自解决什么问题
用 Rust 实现核心检查逻辑,带来的是更低的运行时开销。类型系统主体在 crates/pyrefly_types/src/lib.rs 一类的 Rust 代码里,编译成二进制直接跑,省掉了解释器初始化和大量动态调度——这就是冷启动能压到半秒以内的原因。
只对变更部分重算,让增量检查变得真正便宜。它的 状态管理模块 会记录上一次检查的中间结果,你改了一行,就只重新求解受影响的模块,其余复用缓存。效果是上面表格里 80~120ms 的增量耗时,而不是每次从头再来。
把类型求解分摊到多个核心,让大项目的全量检查不再线性变慢。并行求解逻辑在 pyrefly/lib/solver/solver.rs 中实现,模块数量越多、CPU 核数越多,收益越明显。官方还做过专门的诊断加速优化,方向可以参考:
三个工具怎么选:按团队情况对号入座
- 如果你是维护大型 Python 代码库、希望 IDE 里保存后几乎零等待的团队,建议直接上 Pyrefly,增量检查和 IDE 体验是它的强项。
- 如果你的项目深度绑定 Node.js 生态、或者团队已经用 Pyright 配置了一整套严格模式,那么 Pyright 的性能"够用",迁移成本比收益高,继续用即可。
- 如果你看重兼容性、稳定压倒一切,且检查频率不高(比如只在 CI 里跑),MyPy 作为最成熟的选择仍然站得住脚。
换句话说:追求快选 Pyrefly,求稳求全就留在原有工具链里,不必盲目换。
上手三步,五分钟跑起来
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/py/pyrefly - 按 安装文档 完成本地安装
- 在 IDE 里把类型检查器指向 Pyrefly,保存一次文件试试响应速度
对数据感兴趣的读者,还可以翻翻 基准测试代码,自己复现上面的数字——毕竟工具好不好用,最终要由你的项目说了算。
【免费下载链接】pyreflyA fast type checker and language server for Python项目地址: https://gitcode.com/GitHub_Trending/py/pyrefly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考