两款新型 Rust 基础 Python 类型检查器 pyrefly 和 ty 对比:速度与功能的较量
本月早些时候,两个新的基于Rust的Python类型检查器——pyrefly和ty,吸引了科技界的关注。尽管这两个工具目前尚未正式发布,但它们为长期由mypy和pyright主导的Python类型检查领域带来了新鲜血液。在前不久的PyCon 2025上,Type Summit分会场首次正式展示了这两款工具,详细介绍了背后团队的目标和愿景。 Pyrefly Pyrefly是由Meta开发的全新Rust基Python类型检查器,取代了之前用OCaml编写的Pyre。项目团队明确表示,他们的目标之一是让Pyrefly真正开源,与开源社区更紧密地合作,而不是像Pyre那样主要是满足内部需求后再开放源代码。据团队介绍,Pyrefly的速度比Pyre快35倍,比mypy和pyright快14倍,能够处理每秒高达180万行代码,这使得它能够实现实时类型检查。 Ty ty则是由Astral团队开发的另一款Rust基Python类型检查器,该团队还负责uv和ruff等项目的开发。相比Meta的大张旗鼓,Astral对ty的宣布较为低调,仅有一次GitHub上的软发布、一场30分钟的会议演讲以及一些博客和播客文章。据称,ty的速度比当前一代类型检查器快1到2个数量级。 基准测试 为了验证这些说法,我进行了几次基准测试。首先是在MacBook M4上对PyTorch v2.7.0库进行了测试: PyTorch整体仓库: ty:平均时间4.04秒,范围3.89秒至4.46秒。 pyrefly:平均时间13.03秒,范围12.92秒至13.18秒。 mypy:未能完成测试。 pyright:平均时间262.74秒,范围259.17秒至270.62秒。 仅torch子目录: ty:平均时间1.12秒,范围1.08秒至1.17秒。 pyrefly:平均时间2.35秒,范围2.09秒至2.99秒。 mypy:平均时间24.73秒,范围24.30秒至25.02秒。 pyright:平均时间16.32秒,范围15.85秒至17.18秒。 从测试结果来看,无论是对整个PyTorch仓库还是仅对其torch子目录进行类型检查,ty的速度都显著快于pyrefly,而两者又远超mypy和pyright。 接下来在同一平台上对Django版本5.2.1进行了测试: Django整体仓库: ty:平均时间578.2毫秒,范围557.1毫秒至634.0毫秒。 pyrefly:平均时间910.7毫秒,范围879.6毫秒至963.1毫秒。 mypy:未能完成测试。 pyright:平均时间16.32秒,范围15.85秒至17.18秒。 mypy自身(具体测试mypy中的mypyc子目录): ty:平均时间74.2毫秒,范围71.9毫秒至78.1毫秒。 pyrefly:平均时间136.0毫秒,范围133.4毫秒至139.6毫秒。 mypy:平均时间3.54秒,范围3.42秒至3.77秒。 pyright:平均时间2.85秒,范围2.70秒至3.11秒。 在mypy的测试中,ty的表现依然最快,紧随其后的是pyrefly,而mypy和pyright则明显慢得多。 目标与设计哲学 两个项目的首要目标有所不同。Pyrefly专注于最大化类型推断,即使代码中没有显式类型注解,也能尽可能多地推理出类型,从而减少错误。相比之下,ty遵循“渐进保证”的原则,即在一个类型良好的程序中,删除类型注解不应引起类型错误。换句话说,不需要为已有功能的代码添加新的类型注解来解决类型错误。 渐进增量检查 两个工具都宣称实现了渐进增量检查,即更改一个文件时只重新解析受影响的部分,而不是整个程序。Pyrefly使用自定义的增量引擎,而ty则基于Salsa框架。这意味着ty具有细粒度的增量化能力,更改单个函数只会导致该函数及其依赖项的重新解析;而Pyrefly的模块级增量化会导致整个模块及其依赖的文件被重新解析,尽管这样会简单且维护成本更低,但在性能上几乎没有明显优势。 功能对比 隐式类型推断:Pyrefly在这方面表现突出,能够在无需显式类型注解的情况下推断出函数的返回类型和复杂集合对象的类型。 泛型支持:Pyrefly和ty都支持泛型,但Pyrefly在某些情况下表现更好,尤其是在处理复杂的共性和逆变关系时。 错误消息:ty力求提供清晰、简洁的错误消息,使其在诊断问题时更加友好。 交集和否定类型:ty引入了一个新特性——交集和否定类型,这是目前唯一支持这一特性的Python类型检查器。例如,它能够正确解析给定约束条件下的对象类型,甚至能够利用这些类型解决数学问题,如费马大定理和卡塔兰猜想。 业内评价 业内人士认为,两款工具的出现不仅提高了Python类型的检查速度,还为开发人员提供了更多选择。pyrefly的高性能和对开源社区的积极参与受到好评,而ty的渐进保证理念和创新的错误消息处理机制也备受赞誉。两家公司在科技界都有不错的声誉,Meta作为大型互联网公司,拥有丰富的资源;Astral虽规模较小,但以其高质量的开源项目而闻名。 总之,这两款基于Rust的新Python类型检查器为开发者带来了全新的体验和技术优势。虽然目前仍在早期阶段,但未来的发展潜力巨大,值得期待。感兴趣的读者可以尝试在pyrefly.org/sandbox或play.ty.dev上体验这两种工具。此外,有传言称Google也在计划开放一个基于Go的Python类型检查器,令人兴奋的时刻或将到来。