コンテンツにスキップ

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

はじめに

本記事では、pylyzer、Red Knot、Pyrefly の 3 つを取り上げます。いずれも Rust で開発が進む Python 型チェッカーで、それぞれの特徴と執筆時点の開発状況を整理します。

執筆時点の Python 開発では、Ruffやuvといった Rust 製ツールの利用が広がっています。README によると、Ruff は既存の linter やフォーマッタより、uv はpipより 10〜100 倍高速です。フォーマットや lint、パッケージの依存管理に続く高速化の対象として、私は型チェッカーに注目しています。

型検査を速くする意義

Meta は 2024 年に Python コミュニティを対象として型付き Python の調査を行いました。型を "Always" または "Often" 使うと答えた回答者は 88% です。記事自身も、調査に偏りがある可能性や、結果がコミュニティ全体を代表する意見ではないことに触れています。それでも、コミュニティの一定数の人が型を使っていることは間違いありません。型を使う人が多いぶん、コードベースの大規模化に伴って伸びる型検査の時間を短くできれば、恩恵を受ける開発者も多いはずです。

pylyzer

最初に紹介する型チェッカーはpylyzerです。静的型付き言語 Erg を開発する中で生まれたもので、誕生の経緯は作者がZenn の解説記事で紹介しています。

pylyzer は PyPI からpipでインストールでき、すぐに動かせます。

pip install pylyzer
pylyzer main.py

GitHub の README にあるベンチマーク結果を引用します。pylyzer は、比較対象の pyright や pytype より 100 倍以上速く型検査を終えています。

pylyzer と pyright・pytype の検査速度を比較したベンチマーク結果

Red Knot

次に紹介する型チェッカーはRed Knotです。Ruff や uv の開発元である Astral が、Ruff と同じ GitHub リポジトリで開発しています。

Red Knot を動かすには、Ruff リポジトリのベンチマーク手順ドキュメントに従ってcargoでビルドします。ビルドしたバイナリのcheckサブコマンドに、検査したいファイルやディレクトリを渡して実行します。

cargo build --bin red_knot --release
./target/release/red_knot check path/to/project

実行速度の参考として、Ruff リポジトリのPull Request #13227にあるベンチマーク結果を引用します。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
Benchmark 2: Pyright
  Time (mean ± σ):     245.0 ms ±   4.3 ms
Benchmark 3: mypy
  Time (mean ± σ):      3.270 s ±  0.042 s

Summary
  knot ran
    7.11 ± 0.37 times faster than Pyright
   94.97 ± 4.76 times faster than mypy

Pyrefly (pyre2)

最後に紹介する型チェッカーはPyreflyです。Meta が自社の Python 製型チェッカー Pyre の後継として開発しており、執筆時点の README によると、2025 年末までに Pyre を全面的に置き換えることが目標です。

Pyrefly も PyPI からpipでインストールできます。インストール手順にあるとおり、checkサブコマンドへ検査したいパスを渡して実行します。

pip install pyrefly
pyrefly check path/to/project

開発に使われている Buck2

ほかの 2 つと違う点として私が興味を持ったのは、Pyrefly の開発で Buck2 を使っている点です。執筆時点の README は、開発者ごとに使うコマンドを次のように分けていました。

  • GitHub 上の開発者: cargoコマンド(cargo buildやcargo test)
  • Meta 社内の開発者: buck2コマンド(buck2 runやbuck2 test)

Buck2は、Meta が Buck の後継として Rust で書き直したビルドツールです。大規模なプロジェクトでも高速にビルドでき、多言語に対応しているので、Python と Rust のように複数の言語を扱うプロジェクトでも活用できます。私自身、類似のビルドツールである Bazel や Pants を業務で使っている(使っていた)ので、Buck2 の利用事例として興味を持ちました。

pyreflyリポジトリとpyre2ディレクトリ

執筆時点では、Pyrefly のコードが GitHub 上の 2 か所にありました。1 つはpyreflyリポジトリ、もう 1 つは Pyre のpyre-checkリポジトリ内にあるpyre2ディレクトリです。pyre2の README を読むと、中身は Pyrefly であることが分かります。直近のコミット履歴を見るとpyreflyリポジトリのほうが活発に更新されていたので、今後はpyreflyリポジトリを追うのがよさそうです。

各ツールの比較

3 つのツールの開発元、導入方法、公開されている速度を次の表にまとめました。

項目 pylyzer Red Knot Pyrefly
開発元 個人開発(Erg 開発者) Astral(Ruff / uv 開発元) Meta
導入方法 pip install pylyzer cargo build pip install pyrefly
公開ベンチマーク pyright・pytype 比 100 倍以上 mypy 比 約 94 倍 未確認
成熟度 開発中 開発中 開発中
成り立ち Erg の開発から派生 Ruff と同じリポジトリで開発 Pyre の後継

※ベンチマークの値は、各プロジェクトが公開した測定値の引用です。マシンスペックや対象コード、オプションを統一したツール間の比較ではないため、既存のツールより速くなっているかを示す参考値として見てください。執筆時点では Pyrefly の公開ベンチマーク結果を見つけられなかったため、表では「未確認」としています。

まとめ

本記事で紹介したのは、Rust で書かれた Python 型チェッカー 3 つです。このうち pylyzer と Red Knot の公開ベンチマークでは、どちらも既存の Python 製型チェッカーより速く検査を終えています。Ruff や uv に続いて、型検査の待ち時間も短くなる可能性を示す結果です。ただし、どのツールも執筆時点で開発段階にあるため、正式版(GA)のリリースに向けて今後の開発を追っていく価値があります。

引用した数値は条件をそろえた比較ではありません。手元のコードベースで比べたい場合は、Red Knot のベンチマーク手順ドキュメントなどを参考に、同じ条件で計測してください。