メモ: numpyアクセス高速化

概要

・Cythonを用いてnumpyのarrayへのアクセスを高速化する
・numpy使用時に陥りがちな罠(様々なサイトで書かれているが)をまとめておく

準備(setup.py)

とりあえずsetup.pyを用いたコンパイル方法を使うにあたって、numpyのarrayを使う際に微妙に書き換える場所があるのでそれをメモ
include_dirsの設定を行う必要がある

方法その1

引数にnumpy arrayを取る関数を高速化する方法
今回のデモ関数は、引数にnumpy arrayを取り、その全要素の総和を返す関数
まず下記をcythonTest.pyxとする

これを

でコンパイルする。
次に下記にあるように適当にparent.pyなどとしたファイルにて、上記でコンパイルしたものをモジュールとして読み込む

実行は普通に

という感じで実行。結果は

という感じで234倍くらい早くなっていることが分かります。

方法その2

クラスのアトリビュートにnumpy arrayがあるときに高速にアクセスする方法。
まずpyxファイルはこんな感じ。
classTestクラスがピュアpythonで書いたクラス。addArray関数で配列の全要素の総和を返します。
classTest_cがそれをCython用に書き換えたもの。拡張型クラスと呼ぶらしい。numpy arrayにアクセスする際にはこうやって書くと早くなるらしい。

次にparent.pyはこんな感じ。呼ぶ側(python側)に関しては特に書き方を変える必要はないようです。

実行結果

ということでこちらは247倍ほど早くなりました。

参考

拡張型 — Cython 0.17.1 documentation
http://omake.accense.com/static/doc-ja/cython/src/userguide/extension_types.html

Fast numerical computations with Cython
https://groups.google.com/forum/#!topic/cython-users/nnHXMcR0LU0