【感想】Cython - Cとの融合によるPythonの高速化 -

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

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

感想

ブログを始めて第一回目の感想です。 Pythonを本格的に学ばねばと思ったので、Python本を買い漁ったのですがそのうちの一冊です。 pandasやscikits-learnでも使われているPythonを高速化するツール?Cythonに関する本です。

Cythonについて学んだこと

用途

Cythonには主に以下の用途がありその説明が主です。

Cython利用の流れ

基本的にCythonのコードはPythonのコードをそのまま使うことが出きるんですが、 静的な型の指定など高速化のために拡張されたシンタックスが提供されています。 そのためPythonコードを任意のレベルでC流に書き換えることができます。

Cythonコードを実際に利用する流れとしては以下の通りです。

  • .pyxという拡張子を持つファイルにCythonコードを保存(分割コンパイルの場合はヘッダーファイル的な役割をする.pxdファイルも用意します)
  • それをCに変換、コンパイルし共有ライブラリ(.soファイル)を生成
  • 共有ライブラリをpythonからモジュールとして読み込める場所に配置し、読み込んでCythonコード内に定義した関数を利用

とことんCレベルで高速な処理を行いたい場合はPython/C APIの関数(PyObject_Callとか)が、CythonコードをCに変換した後のコードに出ないように、 定義している全ての変数に対して静的な型を指定することが大事のようです。 (ただボトルネックでないところまでCythonで書くのは労力的によろしくないようです。)

色々できる

Cythonはnumpyと共存できたり、Cレベルでの拡張クラスを実装できたり、C++STLもラップできたり、Cレベルで書いたコードから呼び出されるコールバック関数に通常のPython関数を指定できたりと、かゆいところに手が届く汎用性があるようです。

あと、この本で始めて知ったんですがPythonはGIL(Global Interpreter Lock)というものを持っているらしく、 マルチスレッドにしても、ある一時において実行できるPythonコードはGILにより一つに限られてしまい、スレッドによる並列化の意味があまりないんですね。。 これを乗り越えるためにCythonではGILの制限を外してCレベルでマルチスレッドを扱えるようで、 その例としてOpenMPを使った例が示されていました。 (OpenMPってC/C++のマルチスレッドプログラミングの中で今主流なんですかね。C/C++とかだとpthreadでのプログラミングしかしたことないんですが。。)

個人的に思うこと

いろいろとかゆい所に手が届くCythonですが、 Pythonライブラリを作りたい人、もしくはPythonライブラリをコードリーディングしたい人向けのような気がします。

PythonによるWebサービスとかに使うにはすこし運用しづらいと思います。 コードを変更する度に本番のwebサーバと同じ環境のサーバ上でコンパイルして共有ライブラリを作って本番にデプロイしてモジュールを再読み込みさせたりとか考えたくないです。 (Webサービスの場合はおそらくCythonを使うよりもPyPyを使った方がいい気がするので、Webサービスだけの用途でPythonを使っている場合はPythonに関する教養を身につけるくらいのスタンスでこの本を読んだ方がいいかもしれません。もしくわこの辺のうまい運用の仕方などが書かれているとうれしかったです。)

なので、Webサービス以外の例えば機械学習やデータ分析系のライブラリを出したい、もしくわそういったライブラリにプルリクを投げたいみたいな人は この本はとても価値がある思います(どちらかといえば私は機械学習やデータ分析に興味があるのでこの本を読んでよかったと思います)。