Cython その2 - サブロウ丸の続きです。
今回はCythonでの配列の型付けの話をします。
配列の要素が全て同一の型の場合、(当然ですが)そのことを宣言した方がより高速になります。
Cythonで上記を実現するにはメモリービューと呼ばれるものを使用します。
numpyと組み合わせて使うのが一般的のようです。
要素が全てint型(32bit)の長さがnの配列arrayを宣言するには
cdef int[:] array = np.zeros(n, dtype=np.int32)
と書きます。これで初期値として0が入った配列ができます。
mallocを使う方法もあるそうですが、宣言時に各要素にランダムに値が割り振られるらしく、そのせいで実行するたびに計算結果が異なるといった不具合が生じてしまったので、どうなんでしょう?
単にc言語の知識不足のせいかもしれませんが….
2次元配列の場合は
cdef int[:, :] array = np.zeros((n, n), dtype=np.int32)
と書けば良いです。
またプログラムの最初に
# cython: boundscheck=False, wraparound=False
を追記すれば、メモリビューにアクセスするたびに生じるロス(インデックスが境界内にあるかどうかをチェックする等)を減らせるので、さらに高速になります。ただし、そのぶん安全性を犠牲にすることにはなります。また負のインデックスを使うこともできなくなります。