CythonをWindows XP + MinGWで使うメモ
Pythonの拡張を作る方法は世に数多くあるが,休み時間にふと思い立ってWindowsでCython(http://www.cython.org/)を使おうと思った時のメモ.
CythonはPyrex(http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/)の後継と思しき言語(?)で,Sage(http://wiki.sagemath.org/)というPythonを使った数学ソフトウェアの開発のために作られたらしい.
Pyrexとの違いはhttp://wiki.cython.org/DifferencesFromPyrex を参照のこと.
Pyrexからの乗り換え組みがそこそこいるらしい.今から使うならCythonを選択すべきなのかもしれない.
実際には機能強化点以外はほとんどPyrexであり,実際公式wikiのチュートリアルとしてPyrexのチュートリアルが紹介されていたりする.Pyrex自体日本語情報が少ないのだが,Cythonにいたっては英語情報も実際に使っているソースコード以外あまり無いので,最小構成のサンプルが欲しかった自分は少々苦労する羽目になった.
以下環境はWindows XP + Python2.5 + MinGW + MSYSを想定.
インストール
公式サイトから最新のソースをダウンロードしてきて展開し
python setup.py install
で普通にインストールできる.
使ってみる
サンプルコード
サンプルとしてPyrexのサイトにある指定数の素数を返す関数primesを使う.
ソースコードは以下.
def primes(int kmax): cdef int n, k, i cdef int p[1000] result = [] if kmax > 1000: kmax = 1000 k = 0 n = 2 while k < kmax: i = 0 while i < k and n % p[i] <> 0: i = i + 1 if i == k: p[k] = n k = k + 1 result.append(n) n = n + 1 return result
ほとんどPythonなのだが関数定義の引数や変数に型を指定できるようになっていて,高速化を計ることができるようだ.
これをprimes.pyxとして適当な作業フォルダに保存する.
Cコードへのコンパイル
先ほどの作業フォルダで
python $PYTHON_ROOT_PATH/Scripts/cython.py primes.pyx
でCソースコードprimes.cが生成される.
共有ライブラリのビルド
同様に作業フォルダでMSYSのbashから共有ライブラリをビルドする.
参考にしたページの関係で何かいらないオプションが指定されていたりするかもしれないが気にしてはいけない.
gcc -c -I$PYTHON_ROOT_PATH/include primes.c dlltool -A --dllname primes.pyd --output-exp primes.exp --output-lib primes.lib primes.o gcc -shared -o primes.pyd primes.o primes.exp -L$PYTHON_ROOT_PATH/libs -lpython25
使う
Pythonのモジュール検索パスの通ったところに置き普通にimportしてやれば使える.(拡張子をpydにしないといけないことに気づかずしばらくハマっていた.)
>>> import primes >>> primes.primes(10) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]