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]
終わりに
  • Windowsでも高速なPython拡張が作れるようになったぞ!
  • MSVCコンパイラがある場合はSConsでSharedLibraryビルダを使ってビルドすると楽.
  • Pyrexのページではdistutilsを使う方法も紹介されていて,恐らくこちらの方が楽だと思うのだがWindowsだとビルドツール周りの設定が面倒だったので今回はパスした.