Pythonでループを使わない計算にする(高速化)

ループを使わないようにすると、大分まともに実験ができるようになるようだ。以下の関数を組みわせるとforループを使わずに済む。Matlabかよ。

#A: 行列 (MxN)
#b: 列ベクトル (Mx1)

C=A*A #行列の要素同士の積(アダマール積)→C
D=A*b  #行列の各列の要素とベクトルの積 →D

e = numpy.sum(Mat_hoge,axis=0) #行列の各列の行方向の和
f = numpy.sum(Mat_hoge,axis=1) #行列の各行の列方向の和

# e は1次元のndarray
g = numpy.c_[e] # 1次元ndarrayを2次元ndarray、列ベクトルに
h = numpy.r_[e] # 1次元ndarrayを2次元ndarray、行ベクトルに


例えば、以下のように

#A: 行列 (MxN)
#b:列ベクトル(Mx1)

c = numpy.zeros( (N,1) )
for j in range(N):
   for k in range(M):
      c[j] += A[k,j]*b[k]

c = numpy.c_[numpy.sum(A*b, axis=0)]

と1行で書ける。こっちの方が断然速い。

この書き方を応用してみたところ、22秒かかった計算が0.03秒になった。forループを内包表現した方がよいとか書いているけど、そもそもforループにしない方がよいみたい。

ここまでやってきて、何とか評価実験一歩手前まで来た。結構な時間を使ったが、新しい言語で実験環境構築したし、これくらいかかってもしょうもないか。