swigでpython bindingのメモ

ポリゴン読み込みライブラリのswigを使ったpythonバインディング実験が完了した。
これを使ってBlenderのmqo, pmd, vmdのインポータのデータ読み取り部分を置き換えての動作も確認できたので、今回は予定通りswigを採用することにする。使ってみて気付いたことなどをメモ。

遅くなってしまった

フルpythonで書いていたインポータより遅くなった。C++で書いているのでデータの読み込みは一瞬で終わるのだが、読み込んだデータをpythonとやりとりするのが遅い。
たぶん、

%template(VertexVector) std::vector<meshio::pmd::Vertex>;

こういうのがよろしくない。
これをpython側でfor文で回したときに意図しないnewとかが呼ばれている気がする。
ポインタじゃなくて実体の入った巨大vector(頂点配列やモーションで使う)を使う場合はカスタムのコードを書く必要がありそうだ。

関連してpython側で

assert(vertices[0]==vertices[0])

とやるとC++で別々の実体がnewされて上記がFalseになっているようだ。
(__eq__を定義していない場合にポインタで比較すると仮定。未調査)
リファレンスで取得してポインタで保持するような細工が要るんでないか。

コンパイルが遅い

思ったより遅かった。hoge_wrap.cppが数千行から1万行以上出てくるので仕方ない。

namespaceとかtemplateではまる

C++の元のソースでnamespaceやtemplateを使っているとswigの難易度が上がる。
nestしたクラスを止めたのと、namespace{} 内での型指定の一部を

hoge::fuga::xxx;

のような表記に改めてコンパイルを通したところがある。

整数0がFalseになる?

確かpythonでは0はTrueだった気がするが、真偽値のコンテキストだとC的に0をFalseとして解釈している?。未確認。


もう少し慣れる必要があるがtoluaみたいな感じなのでわりと使いやすい。
内部的にnewやmallocがどう使われるかはある程度把握する必要がある。
std::vectorが遅いことの対策をしてから、blender2.5向けのpython3バインディングrubyバインディングやってみる予定。