SSブログ

Cython 入門 [プログラミング]

冬休みの課題として Cython の勉強をした。
ありがたいことに、増田さんがドキュメント和訳をしてくれている
http://omake.accense.com/wiki/CythonTranslation

.py のファイルを .pyx に拡張子を変更して
↓にある distutils のように Cythonモジュールをビルドするのようにすると
http://omake.accense.com/static/doc-ja/cython/src/quickstart/build.html
import できる *.so ファイルができて、これでだけで3割くらい速くなる。
ただ、全ての python コードが、この形式でビルドできるかは不明。かなりのパターンではできそう。

cdef って宣言して型定義をする↓と、3〜5倍くらいには速くなる感じ
http://omake.accense.com/static/doc-ja/cython/src/quickstart/cythonize.html
ただ、関数テーブル(item に関数が設定された辞書とか)は cdef って定義して python コードから呼び出すことはできないので、何でも cdef って宣言して高速化できるわけじゃない

いろいろ試行錯誤してみたけど、C 言語で書いたモジュールと同じ速度を目指すのは無理。
数値計算みたいなのは何十倍も速くなるかもしれないけど、 I/O が多い普通の python コードをチューニングしても 3 〜 5倍くらいかと思われ。C 言語で python モジュールを書いたのと比べて 1/2 〜 1/3 くらいの速度?
pure python で書かれている関数、メソッド呼び出しに時間がかかるようなので、ループしている内部の呼び出し先の関数・メソッドを cdef に置き換えていくと速くなる。辞書の参照は cdefで型定義している 内部でも python のコードでも同じコードになるようで、そういうのはあまり速くならない。結局のところ速くなりそうな部分と速くならなさそうなところはある。

ここ、3日ばかりの試行錯誤で、頑張って C の関数を呼んで高速化しようとして、ほとんど誤差範囲でがっかりしたことのほうが多いので、適当なところで諦めるのが、Cython を使った高速化で必要なスキルかな、と思ったりした。

もちろん、数倍のオーダーで速くなることもありがたいけど、C 言語のコードをリンクできることのメリットのが大きいのかな、という印象を受けた。


なんか、numpy とか OpenMP とか、数値計算で使うのに便利なことがいっぱいありそうなんだけど、今のところ自分が使うことなさそうなので、冬休みの入門終わり。
コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

Facebook コメント

トラックバック 0