SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonの新機能を知ろう!

Python 3.14の新機能――フリースレッドPythonの正式サポートと高速化などを解説

Pythonの新機能を知ろう! 第7回

安全な外部デバッガインタフェース[3.14]

 Python 3.14では、オーバーヘッドのない安全な外部デバッガインタフェースが導入されました。

 これにより、デバッガやプロファイラといった外部ツールが、実行中のPythonプロセスを停止したり再起動したりすることなく安全にアタッチできるようになり、本番環境でのデバッグ環境が大きく進化することになります。

 このインタフェースは、sysモジュールのremote_exec関数に実装されています。

 この関数は、PythonプロセスのIDと実行したいPythonスクリプトのパスを受け取り、プロセス上でのスクリプトの実行を指示します。Pythonプロセス側では、プロセスを再起動することなく、指示されたスクリプトを実行します。スクリプトには、プロセス情報を取得して一時ファイルに書き込んだり、ログ出力したりといった処理を記述することになります。

図 デバッガインタフェース
図 デバッガインタフェース

 このインタフェースの優れた点は、アタッチすなわちremote_exec関数の呼び出しがない状況では、Pythonプロセスに一切のオーバーヘッドが発生しないことです。

 現時点では、このインタフェースを利用したツールは存在しませんが、将来的には実行中のPythonプロセスにIDEやデバッグツールでアタッチして、デバッグ機能を利用できるようになるはずです。

 なお、このデバッグインタフェースには、アクセス制御のためのいくつかの方法が用意されており、これらを利用して、セキュリティを考慮した運用が可能になっています。

  • PYTHON_DISABLE_REMOTE_DEBUG環境変数を1にセットして無効化
  • pythonのコマンドラインオプションに-X disable-remote-debugを指定して無効化
  • ビルド時に--without-remote-debugオプションで機能を完全に無効化

 主にツール開発者にとって直接的な恩恵がある機能ですが、実行環境におけるデバッグを格段に向上させることから、最終的にはあらゆるユーザーにとって恩恵のある機能と言えます。

テイルコールに基づく新型インタプリタ[3.14]

 Python 3.14では、テイルコール(Tail Calls、末尾呼び出し)に基づく高速なCPythonインタプリタがオプトイン可能になりました。

 テイルコールとは、ある関数最後の別関数の呼び出しをジャンプ命令に置き換えて、別関数から一気に最初の呼び出し元に戻る最適化技法です(ビジネスマンの「直帰」のようなイメージです)。時間のかかるスタック操作と戻り位置のためのメモリを節約し、実行性能の向上を図ります。

図 テイルコール
図 テイルコール

 このテイルコールを、インタプリタにおけるバイトコードの振り分け処理に使い、最適化を十分に行えるようにしながら、関数呼び出しのオーバーヘッドを抑えるのがこの変更です。

従来のインタプリタ:計算済みgoto

 テイルコールの優位性を説明するために、テイルコールを使わない従来のCPythonインタプリタにおけるバイトコードの仕分け処理を説明しておきます。

 従来のCPythonインタプリタでは、計算済みgoto(Computed goto)という手法でPythonバイトコードの仕分けを行っています。計算済みgotoとは、バイトコードをインデックスとしてラベルのアドレスを決定する手法です。

図 計算済みgotoによるバイトコードの仕分け
図 計算済みgotoによるバイトコードの仕分け

 この手法のポイントは、あるバイトコードの処理が終了した時点で、次のバイトコードに対応するラベルへジャンプしてしまうことです。これにより、余計なジャンプを省略することができ、CPUの分岐予測の精度も高めることができることから、単なるswitch~case文で仕分けるよりも性能の向上が図れます。

[NOTE]switch~case文による仕分け

 バイトコードで処理を振り分ける最も原始的な方法は、switch~case文を使うというものです。一般的なコンパイラでは、caseラベルと処理先のアドレスのテーブルを作成し、テーブルから検索、ジャンプというコードを生成します。caseラベルが多くなってくると処理効率が落ちることから、今ではほとんど使われません。

Python 3.14のインタプリタ:テイルコール

 計算済みgotoの問題点は、バイトコードの仕分けと処理を含む関数が巨大になりがちで、最適化も十分に行えない可能性があることと、コードの見通しも悪くなるということです。

 バイトコードの各処理を関数に分離したら、最適化も実行しやすくなり、コードの見通しがよくなりますが、今度は関数呼び出しのためのオーバーヘッドが発生します。そこで、テイルコールによって最後の関数呼び出しをジャンプ命令に置き換え、スタック操作を最小限にして実行効率の向上を図ります。

図 テイルコールによるバイトコードの仕分け
図 テイルコールによるバイトコードの仕分け

 テイルコールは、冒頭で述べたようにオプトインであり、--with-tail-call-interpオプションを指定してのビルドが必要です。コンパイルにはmusttail属性のサポートが必要で、現在のところClang 19以降、GCC 15以降においてサポートされています。

次のページ
エラーメッセージの改良[3.14]

この記事は参考になりましたか?

Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22812 2025/12/26 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング