概要
- Pyrefly と ty は新しいRust製Python型チェッカー
- どちらも従来の mypy や pyright より高速
- 速度・設計思想・インクリメンタル処理・型推論に違い
- それぞれMetaとAstralが開発、オープンソース指向
- まだアルファ版、今後の進化に期待
Pyreflyとty:新世代Rust製Python型チェッカー比較
- 2025年PyCon Typing Summitで Pyrefly (Meta製)と ty (Astral製)が公式初披露
- どちらも Rust で開発され、従来のPython型チェッカー( mypy、 pyright 等)より高速
- Pyrefly はMetaの旧型チェッカーPyre(OCaml製)の後継
- Pyreより 35倍高速、mypy/pyrightより 14倍高速、1.8M行/秒対応
- オープンソースコミュニティと積極的に連携
- ty はAstral(uvやruff開発元)が開発
- 旧名Red-Knot、現在はtyとして展開
- 公開は控えめだが、 1~2桁高速 を目標
- 両者とも Ruff をASTパーサとして採用
- CLI型チェックとLSP/IDE統合に対応
- 共通点は高速なRust実装だが、設計思想や細部で違い
速度比較ベンチマーク
- PyTorch リポジトリ全体・torchサブディレクトリでテスト
- tyがpyreflyの 2~3倍高速、mypy/pyrightの 10~20倍高速
- 検出ファイル数に差(pyrefly:約8600、ty:約6500)
- Django 5.2.1 でも同様の傾向
- ty: 0.6秒(2900ファイル)、pyrefly: 0.9秒(3200ファイル)、pyright: 16秒
- mypyリポジトリ (mypy/mypyc)でも
- ty: 74ms、pyrefly: 136ms、mypy: 3.5秒、pyright: 2.8秒
設計思想・目標
- Pyrefly :型推論を最大限活用し、明示的型なしでも型保証を目指す
- ty :「グラジュアル保証」重視
- 型アノテーションを外しても型エラーが発生しない設計
- 例:属性にNoneを代入後、intを代入してもエラーにならない(Unknown型導入)
- Pyrefly は推論が積極的な分、エラー検出も多い
インクリメンタル処理の違い
- Pyrefly :独自エンジンで モジュール単位 インクリメンタル型チェック
- ファイル単位で再パース、Rustの高速性で十分と判断
- ty : Salsa (Rust Analyzer同様)で 関数単位 の微細なインクリメンタル型チェック
- 依存関数のみ再パース、より細かい最適化
機能・型推論の違い
- どちらも アルファ版、機能は発展途上
- Pyrefly は暗黙的型推論に強み
- 明示的型指定なしでも複雑な型推論が可能
- ty は「Unknown」型で柔軟性重視
-
Anyとの違いを明確化、型安全性と利便性のバランス
-
例: my_list = [1, "b", None] の場合
- pyrefly: int | str | Noneと推論し、val * 2でエラー
- ty: Unknown型で柔軟に対応、エラーなし
- mypy, pyright: objectやUnknown型で曖昧な挙動
-
まとめと今後
- Pyrefly は積極的な型推論・高速性・コミュニティ連携重視
- ty はグラジュアル保証・極細粒度インクリメンタル・柔軟性重視
- どちらも従来型チェッカーより 圧倒的な速度 と 新しい設計思想 を提示
- まだ アルファ版 のため、今後の機能追加・安定化に期待