2020年における各Python処理系の状況

2020年1月1日をもってPython2系列のサポートが終了しました(一部の長期サポート環境を除く)。Pythonは完全にPython3時代に移行し、安定期を迎えているように思います。しかしながら、Pythonは何もCPythonだけではありません。JythonやIronPythonといった他の処理系の現状はいったいどうなっているのでしょうか。気になったので少しだけ調べてみました。


## CPython

![python-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/f987f941-25bc-0dff-f29a-60122f020d83.png)

[公式サイト](https://www.python.org/)
[リポジトリ](https://github.com/python/cpython)

言わずと知れた、オリジナルにして最も有名なPython処理系です。C言語で実装されています。

2020年1月1日にPython2系列のサポート終了(EOL)を行いました。
2020年7月21日には最新バージョンの3.8.5が公開されました。その他3.7系列では3.7.8が、3.6系列では3.6.11がそれぞれ6月28日にリリースされています。
そして、次期バージョンの3.9.0が現在最終ベータ版(b5)となっており、この後約2ヵ月程度のRC(Release Candidate)を経て、10月5日にリリースされる予定となっています([PEP596](https://www.python.org/dev/peps/pep-0596/))。
3.9の新機能が気になる方はこちらへ ⇒ [Python3.9の新機能 (まとめ)](https://qiita.com/ksato9700/items/d5df9d36147796c86c77)

## PyPy

![bitmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/b9541749-5ec6-7b36-2e9a-ab20a48b1e8f.png)

[公式サイト](https://www.pypy.org/index.html)
[リポジトリ](https://foss.heptapod.net/pypy/pypy)

大半がPure Pythonで実装されたPython処理系で、JIT(Just In Time)コンパイラによりCPythonより高速に動作するケースが多いのが特徴です(どんな場合でも速いわけではない)。

最新版は2020年4月5日にリリースされたバージョン7.3.1です。CPython3.6相当とCPython2.7相当の2バージョンが公開されています。現在の動向としてはCPython3.7相当の開発ブランチが切られて開発が続けられていますが、リリースについては未定です。

## Jython

![jython.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/430c9d10-d070-a375-033a-8b3660ae7eab.png)

[公式サイト](https://www.jython.org/index)
[リポジトリ](https://github.com/jython/jython/)

Javaで実装され、JDK等のクラスを使用することができるPython処理系です。

2015年3月にCPython2.7相当のバージョン2.7.0がリリースされ、2020年3月21日にバージョン2.7.2に更新されています。
しかし、バージョン3系列への対応については、[専用リポジトリ](https://github.com/jython/jython3)が用意されているものの、ここ3年ほどコミットがない状態が続いています。主要コントリビュータのJeff Allen氏は、Python3の新たな機能への対応と、古くなったJython実装を考慮して新たな設計・新たな実装を行う必要があるとして、[The Very Slow Jython Project](https://the-very-slow-jython-project.readthedocs.io/en/latest/index.html)を立ち上げ、課題を整理しようと試みています。その名前が示す通り、これは時間のかかる試みになると考えられています。

## Graal Python

![graal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/a9f8a988-24fa-5f91-70f4-79ab02b0aa41.png)

[リポジトリ](https://github.com/graalvm/graalpython)

[GraalVM](https://www.graalvm.org/)というJava VM上で動作する新興のPython処理系です。Python3.7の文法が使用できること、SciPyとその関連するライブラリを使用できることを目標に掲げています。現時点では`experimantal`であると明記されています。また、[Jythonとの互換性](https://github.com/graalvm/graalpython/blob/master/docs/user/JYTHON.md)も考慮しているそうです。
2020年3月20日にGraalVM 20に対応したバージョン20.1.0が、2020年8月5日にGraalVM 19に対応したバージョン19.3.3がリリースされています。Python3.8.2相当の文法を実装しているということです。
JVMで動作するのでJITが働き、[CPythonやJythonよりも高速](https://qiita.com/kotauchisunsun/items/7b7eb1e759e3e4526e62)であるという情報もあります。今後の発展に期待したい処理系です。

## IronPython

![ironpython.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/a10bb764-d329-0284-73e6-2e45df858820.png)

[公式サイト](https://ironpython.net/)
[リポジトリ](https://github.com/IronLanguages/ironpython2)

C#で実装され、.NET Frameworkのライブラリを使用することのできるPython処理系です。

最新版は2020年4月27日にリリースされたバージョン2.7.10です。CPython2.7相当の機能に対応しています。
バージョン3系列への対応については[専用のリポジトリ](https://github.com/IronLanguages/ironpython3)が作成されていますが、「まだ使える段階にはない」とはっきり記述されています。issueにPython3の新機能リストが列挙されていますが、作業量があまりに膨大でリリースまでの道のりは依然遠いと考えられます。

## Brython

![brython.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/6d20c153-e11f-64a4-1b21-2006f4961475.png)

[公式サイト](https://brython.info/index.html)
[リポジトリ](https://github.com/brython-dev/brython)

JavascriptによるPython処理系で、ブラウザ上でPythonコードを実行させることができます。インタプリタ(brython.js)のサイズは約700KBです(ライブラリは別)。

最新版は2020年3月20日にバージョン3.8.9がリリースされていて、これはCPythonの3.8相当の機能を実装しています(筆者環境にて[セイウチ演算子](https://www.python.org/dev/peps/pep-0572/)の動作は確認済み)。
本家(CPython)への追従スピードも速く、安定してコミットが行われており、勢いのあるPython処理系プロジェクトと言えます。

## MicroPython

![micropython.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/ba3ba9e0-228f-2df0-74c9-00acf285098c.png)

[公式サイト](https://micropython.org/)
[リポジトリ](https://github.com/micropython/micropython)

組み込み環境で動かすことを目的としたPythonのサブセット実装です。最小構成では128KBのROMと8KBのRAMで動作するとされており、ESP32搭載のボードや専用のpyboard上で動作させることができます。PIC16やJavascriptへのポートもあります。

最新版は2019年12月20日にリリースされたバージョン1.12です。これはCPython3.4相当の機能に加え、3.5の機能の一部(async/await)を追加したものです。様々なアーキテクチャやペリフェラルへの対応について膨大な数のissueが寄せられており、活発な活動が続けられています。

## Numba

![bitmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/5a8820bc-0888-0125-01dc-e5e8dacacd9b.png)

[公式サイト](http://numba.pydata.org/)
[リポジトリ](https://github.com/numba/numba)

NumbaはPythonコードを高速化するためのJITコンパイラです。特にNumPyの配列や関数を使ったコードに対しての最適化が考慮されています。

最新版は2020年6月24日にリリースされたバージョン0.50.1です。CPythonは3.6～3.8に対応、NumPyは1.15～1.18に対応しています。オープンなissueは1000件を超えており、プロジェクトに対する人々の期待の高さが伺えます(そして人的リソースの足りなさも)。平均して毎週4～50程度のコミットが行われており、非常に活発な処理系であると言えます。

## Cython

![cython.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/7cc233d6-6877-c980-0a36-094124c00825.png)

[公式サイト](https://cython.org/)
[リポジトリ](https://github.com/cython/cython)

Cythonは一風変わったPython処理系です。Pythonの文法に似た独自のCython拡張言語のソースコードをコンパイルし、Python用のライブラリを生成します。これにより少ない労力で高速なライブラリを作成できます。
安定板の最新バージョンは2020年7月9日に0.29.21がリリースされています。そして、2020年7月31日に初めてのメジャーバージョンアップとなる3.0.0のアルファプレビュー版3.0.0alpha6が公開されています。これは後方互換性のない変更を多く含み、Python3の文法がデフォルトとなっています。

## RustPython

![rustpython.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/1ba01fc5-5bdd-b74a-f847-54ae5a22d9f8.png)

[公式サイト](https://rustpython.github.io/)
[リポジトリ](https://github.com/RustPython/RustPython)

2018年からスタートした、Rustで実装されたPython処理系で、Rustアプリ上にPythonを組み込んだり、PythonコードをWebAssemblyにコンパイルしてブラウザ上で動かすといったことも可能です。
最新バージョンは2020年6月22にリリースされたバージョン0.12です。現状で最低Python3.5相当の機能が実装されています。筆者環境で3.6の機能であるf-stringや1_000_000のような数値リテラルの_区切りが実装されていることは確認済みです。3.8の{var=}表記は未実装でした。
今後の発展が楽しみな処理系ですね。

## Nuitka

![nuitka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235258/0fc84550-1f4c-3a4f-c26e-776b6ac5a6c3.png)

[公式サイト](http://nuitka.net/)
[リポジトリ](https://github.com/Nuitka/Nuitka)

NuitkaはPythonコンパイラであり、Pythonソースコードをコンパイルして実行ファイル(.exe等)やPython用のライブラリファイル(*.pyd,*.so)を生成することができます。この方面ではPyInstallerやpy2exeが有名ですが、その対抗馬にあたります。名前の読みはニュイティカが近いみたいです。製作者のKay Hayen氏の奥さんの名前であるAnnuiktaから名前を取ったとのこと。
最新の安定版は2020年6月6日リリースのバージョン0.6.8.4。コンパイル対象のPythonバージョンは2.6～2.7および3.3～3.8となっています。
ちょっと試してみただけですが、自作プログラム(C++のコードも混じってる)も結構簡単に実行ファイル化できました。サイズも思ったより小さくてびっくり。

## Pyodide

(ロゴはみつかりませんでした)

[リポジトリ](https://github.com/iodide-project/pyodide)

Scientific方向に特化したPython処理系です。WebAssemblyの技術を使い、PythonインタプリタおよびNumPy,Pandas,Matplotlib,SciPy,SymPyなどのライブラリをブラウザ上で使用できます。[Jupyter Notebook風のデモ](https://alpha.iodide.io/notebooks/300/)があります。
最新版は2020年3月21にリリースされたバージョン0.15.0です。この時点でCPython3.7.4相当の機能を有します。次期バージョンの0.16では3.8.2相当を目指しているとのことです(リリース日は未定ですが、直近のコミット内容を見る限りそう遠くはないでしょう)。
ちなみに名前はPy + Iodide(ヨウ化物。分かりやすく言うと酸化物のヨウ素版)から来ています。[Iodideプロジェクト](https://alpha.iodide.io/)と関連しているためのネーミングです。



## 更新履歴

2020年中におもしろい変更点を見つけた場合は随時更新していきます。

- 2020年8月5日
    - @superrino130様にコメント頂いたCythonを追記しました
- 2020年8月7日
    - @Piroro様にコメント頂いたRustPythonを追記しました
- 2020年8月9日
    - @eleven-junichi2様にコメント頂いたNuitkaを追記しました
    - @sigmaponta様にコメント頂いたPyodideを追記しました

## おわりに

メジャーどころの処理系は速度の違いはありますが、いずれも開発は継続されているようです。JythonのPython3対応はやや厳しい状況にあるようですが。

いろいろな処理系がありますが、本家の開発がものすごいスピードで進むので、他の処理系はそれに対応するのに結構リソースを割かれている現状が垣間見えます。そのうえで処理系独自の特色を磨き上げていかなければならないので、開発者の皆さんは本当にお疲れ様ですという気持ちです。

他におもしろい処理系をご存知の方はコメントで教えていただけると嬉しいです。