雲雀は高く空を舞い このページをアンテナに追加 RSSフィード

「ひよこは高く空を舞い」について

2009-11-17

[][]Numpy速い! Numpy速い! - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - Numpy速い! - 雲雀は高く空を舞い Numpy速い! - 雲雀は高く空を舞い のブックマークコメント

Pythonの行列・配列ライブラリNumpyは、高速に行列演算が可能とのことだったので,果たしてどのくらい高速なのかしらと言うことで、2個の100次元ベクトル間の距離を計算してみた。距離の計算方法は次の二つ(に無名関数バージョンを追加)

計算環境はPython 2.6 (64bit, on MacOSX 10.6, MacBookPro, 2.53GB C2D, 4GB mem)

def getdistsA(unitA, unitB):
        #dim = len(unitA)
        dist = sqrt(sum([(unitA[x] - unitB[x])  for x in arange(dim)]))
        return dist[0]

def getdistsB(unitA, unitB):
        return sqrt(dot((unitA-unitB)**2, E))
getdistsC = lambda A,B:sqrt(dot((A-B)**2, E))

これを10k回計算してかかった時間を比較した。

tt0 = datetime.datetime.now()
for i in arange(1000*10):
    A = random.random((dim,1))*10
    B = random.random((dim,1))*10
    d= getdistsA(A,B)

tt1 = datetime.datetime.now()
t0 = tt1 - tt0

したところ、リスト内包形式で計算した場合は、10.69秒。行列演算した場合は関数形式で0.343秒、無名関数で0.347秒でした。(ちなみに、距離計算無しでAとBを10k回定義したところ0.231秒でした。

という感じで、NumPyを使った場合計算次第で、使わない場合の3%位の計算時間で実行が可能でした。早い。

ちなみに、matlabで同じ事をした場合0.536秒だったのでもしかしたらPythonが遅いだけかもしれません。


dim = 100
E = ones(dim,1);
funct= @(A,B) ((A-B).^2)*E
tic 
for i = 1:1000*10
   A = rand(1,dim);
   B=rand(1,dim);
   C=funct(A,B);
end
toc
トラックバック - http://chick.g.hatena.ne.jp/allegro/20091117
テクノラティプロフィール