boost-python ではじめる大規模機械学習(5)- 小休止

あらすじ

boost-python を使用して、Python と C 言語両方を活用する方法を説明しています。
前記事では、SciPy の配列に C 言語からアクセスする方法を解説しました。
今回は、実装の方向性について考えます。

PyArrayObject は面倒

前回見た通り、SciPy の配列にアクセスするには何段もの手順を踏む必要があり、面倒です。
PyUblas を経由して BLAS を使用することもできますが、BLAS の最大の問題は 3 次元以上のテンソルをサポートしないことです。

C 言語の配列を Python にエクスポートする

問題解決のひとつの方法は、C 言語の配列オブジェクトを Python にエクスポートすることです。
多次元 vector などのコンテナを Python 側から読み取る、という方法です。
この方法の欠点は、C 言語で定義されたコンテナのラッパーを一通り定義する必要があることと、SciPy の便利関数の恩恵を得られないことです。

boost::multi_array を使おう

本記事では、上記 2 つのアプローチとは異なる方法、Python と C 言語それぞれで配列を確保し、必要に応じて相互にコピーするという戦略を取ります。
メモリ使用量が 2 倍になるため、当然処理は非効率です。しかし、この実装は純 Python の実装よりは十分に速く、かつ C 言語、Python それぞれで自然なコードが記述できるため、プロトタイピングという Python の長所を最大限に活かしているとも言えます。

次回からは、この方針のもと、機械学習アルゴリズム実装の一連の流れを紹介していきます。