Python を速くする取り組み

速い Python 実装といえば PyPy が有名ですが、 Python 3 へのキャッチアップが遅い、 CPython が持っている Python/C API のサポートがまだ弱く遅い、などの欠点があります。

また、 Google の1年プロジェクトだった Unladen Swallow もありました。これは CPython をフォークして LLVMJIT を実装するものでした。この fork 実装は終わりましたが、この時期まだ不安定だったLLVMへの貢献は大きく、(ちゃんとおってないので憶測ですが)現代LLVMを利用したJITを実装しているプロジェクトは全部間接的に Unladen Swallow の成果の上に成り立っていると言えるかもしれません。

終了した JIT プロジェクトといえば、 psyco もありました。これはベタに CPython の JIT を実装していましたが、メンテが大変なのと PyPy に性能で追いぬかれたので終了しました。

他の速度を目的とした Python 実装としては Dropbox の Pyston があります。これも PyPy と同じく Python 2 がメインターゲットですし CPython との互換性も低いですが、より保守的な JIT を実装しています。最近 Nexedi が Pyston の開発に加わりました

また、 MicroPython という組み込み向けの Python もあります。これは CRuby と mruby の関係に似ていると思います。 CPython のしがらみに囚われずにいろいろな動的言語の高速化手法を取り込めるため、 CPython より速いのですが、PC上で普段使いとして使うにはライブラリのカバーしてる範囲が狭いのが欠点です。こっちは pyston と違って Python 3 の実装です。

最近活発な CPython を高速化するプロジェクトが2つあります。 FAT PythonMicrosoftPyjion です。

FAT Python は CPython を高速化にしようとするプロジェクトです。 Ruby 2 系で行われているようなメソッドキャッシュの改良が試みられていたり、さらにアグレッシブに、 AST レベルでのインライン展開や定数の畳み込みといった試みをプラガブルにしようとしています。もちろん Python 3 ベースです。

Pyjion も CPython ベースで、 JIT エンジンを CPython に付けられる用にする、その JIT の参照実装というか実効性の検証用に、 CoreCLR を使ったJITを組み込もうというものです。 IronPython と違って Python そのものの .NET ベースの実装というわけではなくてあくまでも CPython の拡張を提案するプロジェクトです。 まだ詳細は発表されていませんが、もうすぐ PyCon で発表があるはずです。

個人的には、活発化してきた PyPy3 の開発が進んでくれることと、 FAT Python の成果の一部が Python 3.6 に間に合うことを期待しています。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。