🐍

Rust で書かれた高速な Python 型チェッカー 3 選

2025/03/12に公開

導入

昨今の Python 開発では、Ruff や uv といった Rust 製ツールの利用が広がっています。Python 製のこれまでのツールと Rust 製のツールを比較すると、Rust 製のツールはパフォーマンスが高く、短い時間でタスクを完了できます。
本稿では、Rust で書かれた高速な Python 型チェッカーを紹介します。型チェッカーは、Python コードの型を検査し、型エラーを検出するツールです。静的解析ツールとして利用でき、コードの品質を向上させるのに役立ちます。Meta が公開している記事では、2024 年に Python コミュニティに調査を行い、回答者の 88%が"always"または"often"の頻度で型を使用していると回答したようです。この調査に偏りがある可能性や、調査の結果がコミュニティとしての代表的意見ではないということが記事内でも言及されていますが、コミュニティとして一定数の人が型を使用していることは間違いありません。

先述の Ruff と uv の登場により、code format、lint、package の依存管理が高速に行えるようになりました。開発で利用するツールの次なる高速化として、高速な型チェッカーが期待されています。本稿では、Rust で書かれた高速な Python 型チェッカーを 3 つ紹介します。

pylyzer

最初に紹介する Rust 製 Python 型チェッカーは pylyzer です。こちらは、Erg というプログラミング言語を開発している中で、生まれた型検査器です。Erg 開発の過程で型検査器を開発した経緯は、作者の方が Zenn の記事で紹介しています。

pylyzer は PyPI に公開されており、pip でインストールして実際に動かすことができます。

pip install pylyzer

参考としてベンチマーク結果があったので、GitHub の README より引用します。ベンチマーク結果では比較対象の pyright や pytype より 100 倍以上の速度で型検査できることが示されています。

Red Knot

次に紹介する Rust 製 Python 型チェッカーは Red Knot です。Red Knot は Ruff と同じ GitHub リポジトリで開発されています。Red Knot を動かすには、こちらのドキュメントに従って、cargo を使ってビルドします。

cargo build --bin red_knot --release

実行速度の参考として、mypy と pyright と比較したベンチマーク結果がPRで共有されていました。こちらの結果を引用します。Red Knot は mypy と比較して 94 倍、pyright と比較して 7 倍高速であることが示されています。

uv run benchmark  --min-runs=3 --project=black
black (cold)
Benchmark 1: knot
  Time (mean ± σ):      34.4 ms ±   1.7 ms    [User: 126.6 ms, System: 74.6 ms]
  Range (minmax):    31.8 ms …  39.2 ms    75 runs

  Warning: Ignoring non-zero exit code.

Benchmark 2: Pyright
  Time (mean ± σ):     245.0 ms ±   4.3 ms    [User: 156.2 ms, System: 32.6 ms]
  Range (minmax):   238.0 ms … 252.4 ms    12 runs

  Warning: Ignoring non-zero exit code.

Benchmark 3: mypy
  Time (mean ± σ):      3.270 s ±  0.042 s    [User: 3.128 s, System: 0.135 s]
  Range (minmax):    3.222 s …  3.302 s    3 runs

  Warning: Ignoring non-zero exit code.

Summary
  knot ran
    7.11 ± 0.37 times faster than Pyright
   94.97 ± 4.76 times faster than mypy
black (warm)
Benchmark 1: mypy
  Time (mean ± σ):     478.5 ms ±  18.8 ms    [User: 416.1 ms, System: 61.1 ms]
  Range (minmax):   459.0 ms … 507.8 ms    6 runs

  Warning: Ignoring non-zero exit code.

Pyrefly(pyre2)

最後に紹介する Rust 製 Python 型チェッカーは Pyrefly です。Pyrefly は Facebook(Meta) が開発している型検査器で、Meta が元々 Python 製の型検査器として開発していた Pyre の後継として開発されています。2025 年末に Pyre から full replace できることを目標に開発が進められています。

pyrefly は PyPI に公開されており、pip でインストールできます。

pip install pyrefly

他の Rust 製 Python 型チェッカーと違う点として、個人的に興味を持ったのは、buck2 が利用されている点です。pyrefly の開発において、GitHub の開発者はcargoコマンドを利用し、Meta 内部の開発者はbuck2コマンドを利用するようです。buck2 は、Meta が開発しているビルドツールで、buck の後継になります。buck2 自体が Rust で replace されており、大規模なプロジェクトでも高速にビルドできるようになっています。buck2 は多言語対応しており、Python と Rust のように複数の言語を扱うプロジェクトでも活用できます。buck2 の類似のビルドツールとして Bazel や Pants がありますが、私自身これらのツールを業務でも利用している(していた)ので、buck2 の利用事例として興味を持ちました。

話を戻して、pyrefly で他に気になる点は GitHub レポジトリが二つある点です。一つはpyreflyレポジトリ、もう一つは pyre レポジトリの中にpyre2というディレクトリがあります。この pyre2 の README を読むと、pyre2 は pyrefly であることがわかります。直近の commit 履歴を見ると pyrefly レポジトリの方が活発に更新されているので、今後は pyrefly レポジトリを見るのが良いかもしれません。

他の二つの Rust 製 Python 型チェッカーと同じように公開されているベンチマーク結果があれば引用したかったのですが、見当たりませんでした。

ツール比較

機能/特徴 pylyzer Red Knot Pyrefly
開発元 個人開発 Astral (Ruff,uv 開発元) Meta
setup 方法 pip/cargo cargo pip/cargo
速度 (mypy 比) 約 100 倍 約 94 倍 未公開
成熟度 開発中 開発中 開発中
特徴 Erg 言語開発から派生 Ruff と同じリポジトリで開発 Pyre の後継

※ベンチマーク結果は各ツールで公開されたものを引用しています。マシンスペックや実行対象のコード、オプションを厳密に統一したツール間の比較ではありません。既存のツールと比べて早くなってるかどうかを示すための参考としてご覧ください。

まとめ

本稿では、Rust で書かれた高速な Python 型チェッカーを 3 つ紹介しました。どのツールもまだ開発段階であり、今後の GA(General Availability:正式版)リリースが期待されています。この記事では、統一した環境とオプションを用意してそれぞれのツールのベンチマークを実行することはしませんでしたが、各ツールの GitHub レポジトリにはベンチマークの実行方法が記載されているので、興味のある方は試してみてください。また、本稿では各ツールのベンチマークの参考として、公開されているものを引用しましたが、既存の Python 製の型チェッカーと比較して高速であることが示されています。

Discussion