Cython何もわからない
Cythonで何ができる?
拡張子.pyxファイルに、pythonの文法を基本としつつ一部をcythonの文法で型付けすることで、高速に処理を行うことができる。
呼び出すときはimport pyximport; pyximport.install()
を付加すると、あとは通常のimportが可能。(setup.pyを書いて明示的に一度コンパイルする方法もある。)
以下のようなことができる。
- python関数(def)のまま、一部の変数の型を指定する
- cの関数(cpdef, cdef)を書く
- 引数としてnumpy.ndarrayを渡して、集計したり書き換える
- pythonクラス(class)を通常どおり書いて、高速化したい一部の関数だけを書き換える
pythonクラスのクラス変数にcの型をつけることはできない(おそらく)が、それぞれの関数において一時変数に型をつけ、一旦そこに代入して処理を行えば良い。 - cのようなクラス(cdef class)を書く
- c++で記述した関数やクラスを読み込む
pythonと型付けで十分高速化される場合も多く、cの関数やクラスをわざわざ書くのは、パフォーマンスを追求する場合やcで書かれている関数を呼び出す場合など。
多くの場合は、ボトルネックになっている関数を切り出してそこだけCython化するのが分かりやすそう。 探索などを書いているとインスタンス生成がボトルネックになることがあるが、そういった場合はもう少し手を入れないといけないように思える。
サンプルコード
文法が良くわからなくなるので、上記のパターンをまとめてみました。
以前作成した、GBDTをCythonで高速化する例も参考になると思います。
参考文献
この辺りのQiitaは参考になった。
公式ドキュメントはあまり分からないような
オライリーのCython本は参考になったけど、何ができるかベースにもうちょっと落とし込んでほしいような