Cython(0) どんな言語だろう?


2022年 06月 15日

Cythonは、Pythonの最初のPがCに変化しただけだから、きっとPythonと関係するプログラミング言語であることは想像できるのではないだろうか。ということで、ネットで調べてみた。

Cython(サイソン)は、C言語によるPythonの拡張モジュールの作成の労力を軽減することを目的として開発されたプログラミング言語である。その言語仕様はほとんどPythonのものと同じ (上位互換) だが、Cの関数を直接呼び出したり、C言語の変数の型やクラスを宣言できるなどの拡張が行われている。Cythonの処理系ではソースファイルをCのコードに変換し、コンパイルすればPythonの拡張モジュールになるようにして出力する。(Wikipediaより)

確かにPythonはお気楽にコーディングできるのだが、とても遅くて困ることが多い。Pythonの気楽さのままC言語のように高速で動くと嬉しい。Pythonには、なんといっても膨大な量の拡張モジュールがあるので、プログラムの作成時間は非常に短くて済む。それらの拡張モジュールが、CythonでもPythonのときと同じように使えて、簡単に高速化できるのなら、Cythonを使わない手はないだろう。

ということで、これから、CythonがPythonの上位互換で、本当に高速なのかを調べて、ここで報告したい。Pythonで直接書いたプログラムは、コンパイラ言語版と比べると、だいたい数百倍遅くなる。特に、数値計算量が多いときはそうなってしまう。Pythonの拡張モジュールには、よく利用する数値計算に関しては拡張モジュールが用意されていて、実はC言語で書かれていて、こういう場合にはPythonも高速になる。

さて、どうやって勉強したら良いのだろうか?ということで、とりあえずCythonの本があるか探してみた。

すると、見つかったのはオライリー・ジャパンのこの本だけだった。内容的にハードなところもあり、Pythonしか知らない人には厳しそうである。いや、C言語を知っていても、楽とは言えないと思われる内容だった。
さらに困ることは、2015年発売で、旧バージョンのCythonに対応しているので、そのままでは動かない場合がある。

ちゃんとした資料としては、正式のCythonのドキュメントCython 3.0.0a10 documentationを参照されたい。といっても、正式のドキュメントなので、例によって英語である。全部を読む必要はなく、Getting StartedとTutorialだけ読めば、だいたい使えるようになる。上級プログラマを目指すなら、ドキュメントは英語版を読もう。

ということで、ここでは、Cythonの高速化を、できるだけ具体的に解説していきたい。

インストール

とりあえず、インストールの方法について説明しよう。
OSにより色々なやりかたがあるのだが、ここでは自分が普段使っているUbuntu/Linuxの場合についてのみ説明する。

$ sudo apt-get install build-essential

詳しくは、CythonのマニュアルのInstalling Cythonを参照されたし。様々なOSへの様々なインストール方法が説明されている。Raspberry Pi 4 にもCythonをインストールしたが、Linuxと同じ感覚でできた。

インストールできたら、必ずバージョンを確認しておこう。

$ cython -V
Cython version 3.0.0a10

Cythonのバージョンは、0.*.* と 3.*.* の系統があり、3.*.* をインストールして使うようにしたい。Python3に対応しているのが3.*.*である。0.*.*系統のCythonは、Python2に対応しているので、Python3のプログラムをCython化するときには、そのままではエラーになってしまうので注意したい。

Cythonのソースファイル中で、Pythonのソースが、Python2ではなくPython3対応であることを示すには、Cythonソースファイルの先頭で、

#cython: language_level=3

と書いておけば大丈夫ですが、そんな面倒なことはやめて、最新のPythonとCythonを使うようにしましょう。

なお、今後Cythonのことを書きますが、Python, Cython どちらもバージョン3を仮定しています。次回から、CythonはPythonより本当に100倍高速なのか調査開始です。