hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
05/24/2011 ふむ [長年日記]
■ [Py] Python っぽく書いた C コードによるモジュールを Python から使う
Python/C API を使った生の C で書いてある PyMigemo を Cython で書き直すとどうなるか?
結果は こんな感じ. なおこのコードは Unicode 周りを 2 系で書いてるので 3 系ではきっと動かない.Cython 自体は 3 系にも対応してるはずだけど.
所々 C っぽい定義のある Pythonic なコード. 一番最初に Cython のコードを見た時は「うわなにこれきもい」と思ったけれど,ここまで書いてみて「ああ Python で C 書いてるわ」という謎な感じに落ち着きました. いくつかの決まり事を覚えてしまいさえすれば確かにとても楽ちん.
なお Cython は Cython 用に書かれた .pyx を一旦 C のコードに変換して,その C コードを Python から import 可能な .so にコンパイルする形で動作する. つまり C のライブラリを使うわけじゃないけど高速なプログラムを Pythonic に書きたいという場合にも使える. ドキュメント を見ると "This results in a 4 times speedup over the pure Python version." などと書かれていてなかなかに扇情的である. Wikipedia には "数値計算/配列操作では、多くの場合実行速度がおおよそ100倍になる。Python の JIT コンパイラである Psyco の場合はおおよそ 4 倍である。" などと逆に疑ってしまいそうなことも書かれている. きっと高速化可能な部分とそうでない部分があるはずなので何でも速くなるぜというわけではないと思う.
あと「これはいいな」と思ったのは,Cython で作った .so は,Cython が入ってない環境でも動作するらしいということ (環境作りが面倒だったので試してはいない).Gentoo 的に言い換えれば RDEPEND に Cython は必要ないということ.実行時依存が増えないのはありがたい.
ちなみに setup.py を動かすと .so の他に変換済み C コードも残るのだけど,とてつもないコードが吐かれていたのでその辺を見てみるのはまた後日.
ところで Cython って何て読むの? サイソン? シーソン?
05/26/2011 むう [長年日記]
■ [Py] 3 つの Python バインディング
以前 ctypes を使って sched_[gs]etaffinity の wrapper を書いた が,ctypes は libc しか使えないというわけでは全くないので,比較のために ctypes を使った C/Migemo バインディングも書いてみた. 厳密に仕様を同じにしているわけではないので細かい部分では少し違うけど.
ctypes は .dll や .so を Python の世界から使うもので,呼び出す関数の引数や返値の変換に便利なものを色々と提供してくれる. なおここでは .so を前提にしている.
ctypes を使う時に困るのは定数..so を使うものなので .h は知らん的な感じになる. どうしても使いたい場合は h2py や ctypesgen 等を使う感じになりそう.
それと厄介なのはやはりポインタの扱い. C/Migemo では migemo_query() で返ってきた文字列を migemo_release() で解放してやる必要があって,怠ると見事にメモリリークする (当たり前). migemo_query() の返値を c_char_p で定義してしまうと,migemo_query() から返ってきたものをそのまま migemo_release() に渡してもうまくいかない. そこで返値の型を POINTER(c_char) と定義した上で,文字列を取り出す時に c_char_p 型にキャストしている.
さて ctypes 版は Python そのもので,Cython 版は Python/C 中間言語で,C API 版は C そのもので書いてあるわけだけど,まあ個人的な感想としては以下のような感じ.
- ctypes
- さっと .so を使いたい時にさっと使うのにとても便利
- 込み入ったことをしようとすると結構きついこともある
- Cython
- ビルドの手間があるので .so をさっと使いたいだけな時にはハードルになるかも
- C コードが自動生成される点にきもさを感じる人には向かない
- 込み入ったことも結構あっさりできる
- C API
- 何から何まで自分で面倒見たい人向け
なお Cython と C API は別に .so を使うためのものというわけではないので他の用途も盛り沢山である,という点は誤解なきよう.
あとバインディングを作りたいと思った時に 1 度は候補に挙がるであろう SWIG というものもあるけど,こちらは使ったことないので知らない. SWIG は Python 以外も視野に入っている場合にというイメージ. 全然知らないので本当に勝手なイメージだけど.