Cython ―Cとの融合によるPythonの高速化

  • Kurt W. Smith 著

PythonRubyって、一時はキャラがかぶって競合関係にあったような気がするのだけど、今ではWebならRuby、科学技術計算ならPython と別れてしまったような気がする。numpyやscipyなどの数値演算ライブラリを使うと、Pythonで科学技術計算が簡単に書ける。BigData解析やら機械学習なんかも Pythonでやるのが流行っているようだ。

なんでスクリプト言語で科学技術計算ができるのか、かなり不思議だったのだけど、その秘密は Python/C API にある。numpyにしろscipyにしろ数値演算のコア部分は実はC言語で書かれているし、データもC言語の管理する空間に置かれいている。Pythonはライブラリ呼び出しを制御するだけ、という立ち位置なのだ。

Cythonは、このPython-Cエコシステムの一翼を担うシステムである。C言語で書かれたライブラリをラップするコードを半自動で生成してくれる。Pythonコードに変数の型を指定すると効率のよい拡張モジュールにコンパイルしてくれる。実際、numpy やscipyでもCython は使われている。

Cythonでは、Pythonに型を導入した怪しい言語で、C言語とほぼ同じことが記述できる。構造体どころか関数へのポインタを返す関数、みたいなものまで定義できる。Cythonを使うと、C言語Pythonの世界を簡単に行ったり来たりすることができる。C言語レベルのコールバック関数をPythonで書くなんてことまでできるのだ。C言語レベルでmallocしたメモリを特定のPythonオブジェクトに紐づけて、オブジェクトが死んだら開放するようにすることもできる。

さらに驚くべきなのはprangeというコンストラクト。なんと、バックエンドのopenmpを用いて自動並列化するという。。

言語としてのCythonはPython をベースにした独自言語という位置づけになっている。この種の言語でよくあるのは、中途半端な設計と実装のために、動くには動くけど、コーナーケースがありすぎて実際に使ってみるとすごく大変、というものが多いように思うが、Cythonは違う。

アイディアだけで言えば、気の利いた卒論とかにもありそうなネタなのにもかかわらず、凄みさえ感じさせる完成度。おそるべし。

この本はCythonのさまざまな側面を細大漏らさず書いている。著者はCythonのヘビーユーザーで、開発者コミュニティの一員でもある。

C言語のライブラリを多用しているが、C言語ではもうプログラムが書きたくない、なんて人にはCythonがぴったり。一度Cythonでライブラリをラップしてしまえば、Pythonからインタラクティブにライブラリを使うことができる。

実はこの本、縁あって監訳させていただいた。ご興味があればどうかひとつ。