CPythonは、 Pythonプログラミング言語のリファレンス実装です。CとPythonで記述されたCPythonは、Python言語のデフォルト実装であり、最も広く使用されています。
CPythonは、Pythonコードをバイトコードにコンパイルしてから解釈するため、インタプリタとコンパイラの両方として定義できます。C言語を含む複数の言語との外部関数インターフェースを備えており、 Python以外の言語で 明示的にバインディングを記述する必要があります。
CPythonの特徴は、グローバルインタープリタロック(GIL)を使用することです。これにより、各CPythonインタープリタプロセスでは、一度に1つのスレッドのみがバイトコードを処理できます。 [ 2 ]これは、マルチスレッドに意味がないという意味ではありません。最も一般的なマルチスレッドのシナリオでは、スレッドは主に外部プロセスの完了を待機します。
これは、複数のスレッドが別々のクライアントにサービスを提供している場合に発生する可能性があります。あるスレッドがクライアントからの応答を待機し、別のスレッドがデータベースクエリの実行を待機している間に、3つ目のスレッドが実際にPythonコードを処理している可能性があります。
ただし、GIL は、複数のコアに分散される可能性のある Python コードで CPU を集中的に使用するアルゴリズムを実装するプロセスには CPython が適していないことを意味します。
実際のアプリケーションでは、GILが重大なボトルネックとなる状況は非常に稀です。これは、Pythonが本質的に低速な言語であり、CPU負荷の高い処理や時間的制約のある処理には一般的に使用されないためです。Pythonは通常、トップレベルで使用され、ライブラリ内の関数を呼び出して特殊なタスクを実行します。これらのライブラリは通常Pythonで記述されておらず、これらの基盤となるプロセスのいずれかが呼び出されている間に、別のスレッドでPythonコードが実行される場合があります。CPU負荷の高いタスクを実行するために呼び出される非PythonライブラリはGILの影響を受けず、複数のプロセッサ上で多数のスレッドを制限なく同時に実行できます。
Pythonコードの並行処理は、マルチタスクオペレーティングシステムによって管理される個別のCPythonインタープリタプロセスによってのみ実現できます。これにより、同時実行中のPythonプロセス間の通信が複雑になりますが、マルチプロセッシングモジュールによってある程度軽減されます。つまり、Pythonコードの同時実行から真にメリットを享受できるアプリケーションを、オーバーヘッドを最小限に抑えて実装できるということです。
GILの存在により、CPythonの実装が簡素化され、Pythonコードの同時実行のメリットを享受できないマルチスレッドアプリケーションの実装が容易になります。しかし、GILがない場合、マルチプロセスアプリケーションでは、共通コードがスレッドセーフであることを確認する必要があります。
GILを廃止する提案は数多くなされてきたものの、ほとんどの場合、GILの利点が欠点を上回るという一般的なコンセンサスが得られています。GILがボトルネックとなる少数のケースでは、アプリケーションはマルチプロセス構造を中心に構築されるべきです。より多くの並列処理を可能にするため、2023年10月に、単一のPythonプロセス内のサブインタプリタごとに個別のGILを許可する改良版がリリースされました。これは「オプトイン共有機能を備えたスレッド」と表現されています。[ 3 ] [ 4 ]
数回の議論を経て、2023年にPythonのバージョン3.13からGILをオプションにすることを提案するプロジェクトが開始され、[ 5 ] 2024年10月7日にPython 3.13.0でリリースされました。[ 6 ] [ 7 ]
2009年に、GoogleがスポンサーとなったUnladen Swallowというブランチが作成され、CPythonにジャストインタイムコンパイラを組み込むことになりました。 [ 8 ] [ 9 ]開発は2011年に終了しましたが、メインの実装には統合されませんでした。 [ 10 ]ただし、cPickleモジュールの改良など、一部のコードは統合されました。[ 11 ] [ 8 ]
2021年には、「特殊化適応型インタープリタ」が提案されました。これは、見かけ上の型安定性を示す一般的に実行される命令をより高速な型固有の命令に特殊化し、必要に応じて命令の特殊化を解除することで、パフォーマンスが10~60%向上すると測定されました。[ 12 ] SAIはPython 3.11で初めて搭載され、「pyperformance」ベンチマークスイートではPython 3.10よりも平均25%高速であることが測定されました。[ 13 ]
2024年、実験的なジャストインタイムコンパイラがCPythonのメイン開発ブランチに統合されました。この初期のJITはLLVM上に構築され、ホットコードパスの高速化を目的としています。統合時点では、このコンパイラはまだCPythonのデフォルトのビルド構成には含まれておらず、SAIとほぼ同等のパフォーマンスを提供していました。完全採用の条件の一つは、少なくとも5%のパフォーマンス向上でした。[ 14 ]デフォルトでは無効になっていますが、ユーザーはこれを有効にして実験し、Pythonが最終的に他のJIT言語に匹敵するようになるかどうかを確認できます。[ 15 ]
公式にサポートされている Tier 1 プラットフォームは、GCC ツールチェーンを使用する 64 ビット Intel 向けLinux 、 64 ビット Intel および ARM 向けmacOS 、 32 ビットおよび 64 ビット Intel 向けMicrosoft Windowsです。公式の Tier 2 サポートは、64 ビット ARM 向け Linux、WASI ランタイム サポート付きの wasm32 ( Web Assembly )、および clang ツールチェーンを使用する 64 ビット Intel 向け Linux に対して存在します。公式にサポートされている Tier 3 システムには、64 ビット ARM Windows、64 ビット iOS、Raspberry Pi OS (ハード フロート付きの armv7 向け Linux)、リトルエンディアン モードの 64 ビット PowerPC 向け Linux、およびs390x向け Linux があります。
他にも多くのプラットフォームで実装が進んでおり、その中には次のようなものがある: [ 16 ]
PEP 11 [ 17 ]には、Python Software FoundationによってCPythonでサポートされていないプラットフォームがリストされています。これらのプラットフォームは、外部ポートによって引き続きサポートできます。これらのポートには以下が含まれます。
Python Software Foundation の公式 CPython バージョン(メイン開発サイトへのリンク付き)に統合されていない外部ポートには、PSP や SMS 用のグラフィックおよびサウンド API、S60 用のカメラ API など、プラットフォーム固有の機能のための追加モジュールが含まれていることがよくあります。これらのポートには以下が含まれます。
これらのPythonのバージョンは、現在サポートされているエンタープライズLinuxディストリビューションで配布されています。[ 26 ]表のPythonのサポート状況は、ディストリビューションのメンテナーからのサポートではなく、Pythonコアチームからのサポートを示しています。
CPythonは、 Java仮想マシン(JVM)向けにJavaで記述されたJython 、 RPythonで記述されC言語に翻訳されたPyPy 、そして共通言語基盤向けにC#で記述されたIronPythonなど、いくつかの「製品品質」のPython実装の一つです。また、実験的な実装もいくつか存在します。[ 48 ]