14 ポイント 投稿者 GN⁺ 2024-09-29 | 3件のコメント | WhatsAppで共有

Python 3.13の主な変更点

  • 2024年10月7日にCPython v3.13.0がリリース予定
  • このバージョンには、Pythonの性能に大きな影響を与える可能性がある2つの主要な変更が含まれる
    • Global Interpreter Lock(GIL)を無効化できる「free-threaded」版
    • 実験的な Just-in-Time(JIT)コンパイルのサポート

Global Interpreter Lock(GIL)

GILとは?

  • Pythonは1980年代後半にGuido Van Rossumによって単一スレッドのインタプリタ言語として設計・実装された
  • Pythonはソースコードをバイトコードにコンパイルした後、インタプリタがそれを実行する
  • オブジェクトにすべてのスレッドから安全にアクセスするため、global lock(GIL)を使用する
    • 複数のスレッドが同時にバイトコードを実行できないようにするグローバルな相互排他ロック
  • 共有メモリの利用を制限する一方で、単一スレッド性能には有利

PythonにGILがある理由

  • 1990年代初頭、ほとんどのプログラムは単一スレッドであり、単一コアの性能が急速に向上していた
  • マルチスレッド安全性のために単一スレッド性能を犠牲にする必要がなかった
  • 複数コアの活用にはマルチプロセスを使えた(multiprocessing モジュール)

なぜ今GILを取り除くのか?

  • Python core開発者たちは長年GILの削除を望んでいたが、単一スレッド性能の低下への懸念から実行できなかった
  • 近年マルチコアが一般化し、GILによるマルチスレッドの制約が問題になっている
  • Microsoftの支援を受けた「Faster CPython」プロジェクトがPythonの性能改善に貢献した
  • Sam GrossがGILのない実装を提案し、PEP 703が採択された
  • 段階的導入計画: 実験的オプション → 公式サポート → デフォルトモード
  • こうした背景から、GILを段階的に取り除く計画が承認された

性能はどうか?

  • Free-threadingを有効にすると、単一スレッド性能は約20%低下する
  • GILを無効化したマルチスレッドでは大幅な性能向上が見られる
  • GILを有効化したマルチスレッドは単一スレッドより遅い
  • GILを無効化したマルチスレッドはマルチプロセシングに近い性能を示す

Free-threading Pythonをどう使うか?

  • pyenvでPython 3.13.0rc2tをインストールするとfree-threading版を利用できる
  • デフォルトでGILは無効化されており、-X gil=1 で実行時にGILを再び有効化できる
  • GIL freeをサポートしていないモジュールを import すると、自動的にGILが有効になる

JIT(Just-in-Time)コンパイラ

JITとは?

  • 従来の ahead-of-time コンパイルと異なり、実行直前に machine code を生成する手法
  • Python 3.13以前は、バイトコードを1つずつ機械語に変換して実行していた
  • JITの導入により、バイトコードをまとめて機械語に変換し、必要に応じて更新できる
  • Python 3.13に導入された手法は「copy-and-patch」JITで、あらかじめ定義されたテンプレートに一致する bytecode を native code にパッチする
  • より高度なJITコンパイラは、頻繁に実行される「hot」な領域を最適化できる

JITの影響は?

  • 短期的には、Pythonコードの記述や実行に大きな変化はない見込み
  • しかし段階的な性能改善が進み、他の言語と競争できるようになることが期待される

JITをどう使うか?

  • Python 3.13におけるJITは実験的であり、デフォルトでは有効化されていない
  • PYTHON_CONFIGURE_OPTS="--enable-experimental-jit" オプションでビルド時に有効化できる
  • 実行時に PYTHON_JIT=0/1 で有効化の有無を制御できる

結論

  • Python 3.13は、runtimeに興味深い新しい概念と機能を導入する大きなリリース
    • GILの撤廃とJITの導入によって重要な変化を予告している
  • 短期的には大きな変化はないかもしれないが、長期的にはPythonの性能に良い影響を与えるだろう
    • free-threadingとJITが成熟するにつれて、特にCPUバウンドな処理で性能に大きな影響を与えると予想される

GN⁺の意見

  • 今回のPython 3.13アップデートは、Pythonエコシステムに大きな変化をもたらしそうだ。GILの撤廃によりマルチスレッドのボトルネックが解消され、JITの導入によって全体的な実行速度の改善が期待される。
  • ただし、こうした変化が完全に安定するまでには時間がかかるだろう。C extension など既存パッケージの互換性問題が発生する可能性があり、マルチスレッドプログラミングでは race condition など新たなバグが生じることもありうる。
  • Pythonの遅い速度はこれまで欠点として指摘されてきたが、今回のアップデートでこうした認識が改善されることを期待したい。従来の生産性や可読性という長所に速度まで備われば、Pythonはさらに広く使われる言語になるだろう。
  • それでも根本的には動的型付け言語であるという限界はある。静的型付け言語の利点を取り込もうとする取り組みも引き続き必要だろう。最近Pythonに導入された type hinting や Cython などを積極的に活用すれば、ある程度は解決できるはずだ。
  • 総合すると、Python 3.13は興味深く前向きな変化をもたらしそうだ。開発者が今回の変化をよく理解し活用して、より良いPythonプログラムを作れることを期待したい

3件のコメント

 
ilotoki0804 2024-09-30

GILの削除もJITも、たとえ現時点ではまだ小さな一歩だとしても、Pythonの流れを変える非常に重要な進歩です。『最も遅い言語』という汚名を脱ぎ捨て、今後さらに多くの分野で活用されるPythonの未来に期待が高まります。

 
ilotoki0804 2024-09-30

Free threading(GIL削除)の重要性については、PEP 703でさまざまな人の意見とともによく整理されています。
また、該当PEPによると、シングルスレッドでの性能低下は5~6%に過ぎないとのことですが、この投稿や一部の hn コメントで20~50%の性能低下があるとする主張は納得しがたいですね。確認できる出典もありませんし。

 
GN⁺ 2024-09-29
Hacker Newsのコメント
  • GIL を削除すると、一般的な Python プログラムは遅くなり、複雑さも増すだろうという意見

    • 実際に得られる利点には疑問がある
    • 複数の CPU コアを最大限活用する必要がある場合は、OS にプログラムの複数インスタンスを実行させ、並列化ロジックをプログラムに追加する方法を使う
  • JIT を有効にしたバージョンをダウンロードできないことへの不満

    • 自分で Python 3.13 をコンパイルすることはできるが、多くの人は試さず、フィードバックも寄せないという体験の共有
  • 「Jack and Jill went up the hill」という童謡に似ているという意見

    • 「up the hill」が何を意味するのか分からず混乱した
    • JIT はリリースしたが、GIL は削除されたのかという疑問
  • 短時間で終了する小さなメモリ使用量のプログラムでは、ガベージコレクションを無効にすると速度が大きく向上するという体験

    • これを自動化できるのか気になる
    • 小さなプログラムがメモリを使い切ってしまうエッジケースの危険性にも言及
  • 2021 年に GIL 削除に関する最初の議論があり、当時の説明に納得できなかった人にとって良い要約だという意見

  • GIL なしの場合を最適化するのは本当に不可能なのかという疑問

    • 20% 遅くなるのは大きな問題だという意見
  • リリース日が 10 月 2 日から 10 月 7 日に変更されたという知らせ

    • 関連リンクの共有
  • nogil の性能低下は 20% と引用されているが、最大 50% に達する可能性があるという意見

    • JIT は大きな助けにならないという点
    • CPython の社会的・企業的な問題を反映した、期待外れのリリースだという意見
    • 一部の人が機能を約束し、100% 熱意のない人を黙らせたうえで、期待外れの結果を出しているという主張
  • 驚くようなタイトルだという意見

  • 自動並列化に関する最近の研究へのリンクを探しているという質問

    • シングルスレッドのコードを書き、コンパイラがマルチスレッドコードを生成する方式に関するリンクの共有