2016-06-23 7 views
1

大きな反復回数で掛ける大きな配列もあります。Pythonで大きな配列を掛け合わせる

私は約1500のアレイを持つモデルを訓練しており、私は約1000000回3回の乗算を行います。

私は通常のnumpyの方法と比較してみましたが、私はより速くnumpyのを見つけたDASKが見つかりました:

x = np.arange(2000) 

start = time.time() 
y = da.from_array(x, chunks=(100)) 

for i in range (0,100): 
    p = y.dot(y) 

#print(p) 
print(time.time() - start) 

print('------------------------------') 

start = time.time() 

p = 0 

for i in range (0,100): 
    p = np.dot(x,x) 

print(time.time() - start) 

0.08502793312072754

0.00015974044799804688

私はDASK間違って使っていますかそれは速いですか?

答えて

2

.dotのパフォーマンスは、NumPyの実装がリンクされているBLAS libraryによって大きく異なります。

OpenBLASやMKLのような最新の実装をお持ちの場合、NumPyはすでにすべてのコアを使用してフルスピードで動作しています。この場合、dask.arrayはおそらく邪魔になるだけで、何も保証されていない場合には並列処理を追加しようとし、スレッドの競合を引き起こします。

NumPyをAnaconda経由でインストールした場合は、すでにOpenBLASまたはMKLがインストールされている可能性があります。そのため、あなたのパフォーマンスに満足して1日と呼んでください。

しかし、あなたの実際の例では、あまりにも小さいチャンクを使用しています(chunks=(100,))。 daskタスクスケジューラは、タスクごとに約1ミリ秒のオーバーヘッドを発生させます。このオーバーヘッドを隠すために、各タスクが100秒の何処かにかかるようにチャンクサイズを選択する必要があります。一般的には、1メガバイトを超えるチャンクを目指すことが大切です。これはあなたが見ているパフォーマンスの大きな違いを引き起こしています。

+0

私はチャンクを増やしました。そして、最高は0.054であり、これはまだナンシーからは遠いです。 あなたが言ったように、Numpyはすでに並列化されていると思います。詳細な説明をお寄せいただきありがとうございます。現在はより明確です –

+0

幸い、小さな問題では、並列コンピューティングフレームワークのオーバーヘッドは、通常、それが助けてくれる以上のものになります。 – MRocklin

関連する問題