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ループにしない方がよいみたい。
ここまでやってきて、何とか評価実験一歩手前まで来た。結構な時間を使ったが、新しい言語で実験環境構築したし、これくらいかかってもしょうもないか。