8 ポイント 投稿者 GN⁺ 2024-01-10 | 1件のコメント | WhatsAppで共有

Python 3.13にJITコンパイラを追加

  • CPythonコア開発者のBrandt Bucherが、Python 3.13ブランチにJITコンパイラを追加するプルリクエストを提出。
  • この変更は、Python 3.11で追加された特殊化適応インタプリタ以降、CPythonインタプリタにおける最大級の変更の1つとなる見込み。

JITとは何か?

  • JIT(Just in Time)コンパイルとは、コードが最初に実行される時点でコンパイルが行われる設計を指す。
  • JITコンパイラは機械語コードを生成するコンパイラのことで、AOT(Ahead of Time)コンパイラと対比される。
  • Pythonコードはまずバイトコードにコンパイルされるが、このバイトコード自体はCPUにとって意味を持たず、特別なバイトコードインタプリタループを通じて実行される。

copy-and-patch JITとは何か?

  • copy-and-patch JITは、2021年に提案された概念で、動的言語ランタイム向けの高速アルゴリズムとして設計された。
  • copy-and-patch JITは、各命令に対する命令列をコピーし、バイトコード引数を埋める(パッチする)という発想に基づく。

copy-and-patch JITの長所と短所

  • 「完全な」JITコンパイラは高水準バイトコードを中間言語(IL)の低水準命令へコンパイルする一方、copy-and-patch JITはバイトコードから機械語コードへのコンパイルをテンプレートの集合で実現する。
  • copy-and-patch JITでは、複雑なJITコンパイラアーキテクチャをPythonランタイム内で動かす必要がなく、LLVMのJITツールをソースからCPythonをコンパイルするマシンにインストールするだけでよい。

このJITはどのように動作するのか?

  • Python 3.13のAPIに新たに追加されたAPIを拡張し、プラグイン可能なオプティマイザをランタイム時に検出できるようにする。
  • 新しいJITは、この新アーキテクチャ向けのオプションのオプティマイザである。
  • ソースからCPythonをコンパイルする際に --enable-experimental-jit フラグを指定すると、Pythonバイトコード向けの機械語コードテンプレートが生成される。

このJITはより高速なのか?

  • 初期ベンチマークでは、およそ2〜9%の性能向上が示されている。
  • このJITは、Pythonの性能を大きく向上させうる一連の最適化の礎となる。

GN⁺の見解

  • Python 3.13に追加されたJITコンパイラは、Pythonの実行速度を向上させる重要な変更であり、とくに反復的な処理の効率を高める可能性がある。
  • copy-and-patch JITは、複雑なJITアーキテクチャをユーザーのPythonランタイムに統合することなく性能を向上させる革新的なアプローチを提供する。
  • この技術はPythonコミュニティに興味深い議論をもたらし、Pythonの性能最適化に新たな扉を開くことが期待される。

1件のコメント

 
GN⁺ 2024-01-10
Hacker Newsの意見
  • ソフトウェアのバージョン間で 2〜9% の性能向上があるのは興味深い。このような小さな改善は物足りなく見られることもあるが、継続的に積み重なって各バージョンが前より速くなっていくほうが好ましい。
  • Haoran Xu と Fredrik Kjolstad の「copy-and-patch」手法が注目されているのは素晴らしい。Xu の LuaJIT リメイクプロジェクトのブログ記事で初めて知った。既存技術を再利用して新しいものを生み出すやり方はとても巧妙に感じられる。そのブログ記事は言語実装について学びたい人におすすめできる。また、Xu はブログ更新が遅れた理由がバックエンドの作り直しだったと明かしている。
  • Brandt は昨年の CPython コア開発者スプリントでこのテーマについて発表した。
  • PyPy、Jython、GraalPy、IronPython での取り組みにもかかわらず、CPython に JIT が追加されることは Python エコシステムにとって重要な進展と見なされている。特に 3.13 以降でどう進化するかが期待される。
  • Python を Web 開発以外のあらゆる用途に使っているので、性能が向上するなら非常に歓迎だ。Python エコシステムは CGI や mod_php のようなステートレスなリクエスト処理から離れ、長時間実行プロセスへ移行してきた。これはローカルの Web アプリケーションを変更するたびに再起動が必要という意味なのか、一部の開発者はファイル保存時にアプリケーションを自動再起動する方法を使っている。
  • CPython はコードベースを非常にシンプルに保ち、最適化は他の実装が担うことになっていたのを覚えている。
  • 記事では「copy-and-patch」JIT を新しいものとして紹介しているが、DOS の QuickBASIC が似た方式を使っていたのを覚えている。QuickBASIC はメモリ内のテンプレートアセンブリブロックにパッチを当てていて、非常にひどいアセンブリコードを生成していた。
  • この 2 年間の Python 性能の進展には驚かされる。コアチームが性能向上を真剣な目標として掲げ、目に見える改善を実現してきた。
  • PyPy に資金が投じられることを望む。ただ、PyPy は小さなプログラムでは起動時間があまり良くなく、大きな利点を感じにくい。また大規模なプログラムでは複雑な互換性問題が起きることもある。もし CPython の JIT がより信頼性が高い、あるいは起動時間が速いなら、そうした問題の一部を解決できるかもしれない。
  • Python の GitHub リポジトリにある、『クリスマス前の夜』をパロディにした PR メッセージは気が利いている。