ちゃぱブログ / エンジニアリング / マネジメント

とあるプロダクトの運用組織のマネジメントしてる人の雑記

Pythonの実装について(CPython / PyPy / Stackless Python)

プログラミング言語Python」と一口に言っても、Python自体がどのように実装されているかには種類がある。別件を調べている中で、Pythonの実装に関する話題が出たので表面部分について少し整理する。

Pythonの実装の種類

ざっと書くだけでも以下の種類がある。(出展:Wikipedia

  • CPython:作者によってC言語で書かれたバージョン。通常「Python」といえばこのCPythonを指す。
  • Stackless Python:Cスタックを使わずに独自のスタック(Pythonスタック)で実装したもの。
  • Unladen Swallow:GoogleのチームによるPythonの実装
  • JythonJava仮想マシン上に移植したもの。PythonからJavaのライブラリを使うことができる。
  • IronPython.NET Framework/Monoで動作するPythonC#で実装されている。.NET Frameworkのライブラリを使うことができる。動的言語ランタイム上に構築されているため、既存の.NETアプリケーションへマクロ言語として搭載することも可能となっている。
  • PyPy:Python (RPython) によるPythonの実装
  • Psyco:CPython向けのJITコンパイラ
  • PyMite:組み込み向けの実装、AVRなどに対応。
  • tinypy:同じく組み込み向けの実装。ソースコードが 64 kB未満と非常に軽量なことが謳われている。
  • MicroPython:組み込み向けの実装。256 kB以上のフラッシュを推奨。
  • Pyodide:WebAssembly向けの実装

どれを調べるか?

低レイヤ向け、組み込み向けは、普段の業務や興味の中で出てこないので調査から除外。 2021年1月時点で「Jython」「IronPython」はPython2系のみの対応なので除外。 「Unladen Swallow」は、Google Codeを見ても2013年のIssueで止まっており、今となってはソースの閲覧もできなさそうなので除外(Wikipediaはこういうの除外しておいてほしい・・・)。

というわけで、生き残ったのは「CPython」「PyPy」「Stackless Python」。これらを軸に調べてみる(が、調べた結果をキレイにまとめるには至らなかった・・・)。

CPythonのデメリット?

「PyPy」は「速度」、「Stackless Python」は「スレッドベースのプログラミング」を推してくる。 これらがCPythonにおけるデメリットで、その解消のために生まれてきたものたちが上のふたつの実装ということになる。 ちなみに「PyPy」は「Stackless Python」に似たような機能も実装されているようだ。

doc.pypy.org

さいごに

全く細かいところに行きつかなかったが、おおよその違いはわかった。もともとASGIを調べていたところから「PyPy」の話に派生したのだけど、単純に「速度」だけだとしっくりきていなかった。「Stackless Python」と絡めて調べたことで「スレッドベース」のキーワードが出てきて、やっとASGIと繋がった。

参考リンク

pypy開発の基礎知識を入門者向けに解説!Pythonと比較した処理速度の速さとは?pypyのインストール方法も紹介 | A-STAR(エースター) ※この記事は基本を理解しやすかった

PyPyの基礎知識まとめ その1 - Qiita

Stackless Pythonでは、プログラムがユーザをファンクションコールする! - Qiita