2017-01-05 22 views
1

質問:numpy配列の乗算を最適化する:* numpy.dotより高速ですか?

1)それはどのようにBLASが使用されているときnumpy.dot()は、以下のコード例では*より遅いということですか?

2)この場合、*の代わりにnumpy.dot()を実装する方法がありますか?私は質問1に答える重大な情報がなく、numpy.dot()が少なくとも早く*であることを意味します。

詳細は以下のとおりです。回答と助けをお寄せいただきありがとうございます。

詳細:

私は私が必要とするプログラムの出力の精度を向上させるために、Windows 7上で、Anaconda2をのpython 2.7(64ビット)を使用して、結合偏微分方程式を解くプログラムを書く、numpyの1.11.2います大規模な配列(形状(2^2^14)以上)と小さな積分ステップを使用することで、シミュレーションごとに膨大な数の配列乗算演算を実行し、速度を最適化する必要があります。

looked aroundを持つと、BLASがインストールされ、numpyで動作している限り、*に対しては、より高速な配列の乗算には、numpy.dot()を使用する必要があります。これはしばしば推奨されます。私は以下のタイマースクリプトを使用する場合ただし、* 1000>これが要因に増加いくつかのケースでは7の少なくとも倍にnumpy.dot()よりも高速です:

from __future__ import division 
import numpy as np 
import timeit 

def dotter(a, b): 
    return np.dot(a, b) 

def timeser(a, b): 
    return a*b 

def wrapper(func, a, b): 
    def wrapped(): 
     return func(a, b) 
    return wrapped 

size = 100 
num = int(3e5) 

a = np.random.random_sample((size, size)) 
b = np.random.random_sample((size, size)) 

wrapped = wrapper(dotter, a, b) 
dotTime = timeit.timeit(wrapped, number=num)/num 
print "\nTime for np.dot: ", dotTime 

wrapped = wrapper(timeser, a, b) 
starTime = timeit.timeit(wrapped, number=num)/num 
print "\nTime for *: ", starTime 

print "dotTime/starTime: ", dotTime/starTime 

この出力:

Time for np.dot: 8.58201189949e-05 
Time for *: 1.07564737429e-05 
dotTime/starTime: 7.97846218436 

numpy.dot()*私はBLASは、少なくとも、ある程度取り組んでいることを示唆していると思う複数のコア、全体に分散されている両方:

enter image description here

それは私がBLASを使用していたかのように表示され、LAPACK(openblas_lapackれていないが?)numpy.__config__.show()を見る:*は、要素ごとの乗算である一方、

lapack_opt_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
blas_opt_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
openblas_lapack_info: 
    NOT AVAILABLE 
lapack_mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
blas_mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
+3

アップルとオレンジの古い比較... – Bakuriu

+0

@バクリュウ私はそれを助けることができないようです。古い習慣は、明らかに難しい。 –

答えて

4

np.dotは行列 - 行列乗算を呼び出します。行列と行列の乗算の記号はPython 3.5+の場合は@です。

+0

優秀、ありがとう。愚かな間違いが指摘されたのはいつも良いことです! 新しいルール:睡眠時間が増え、カフェインが少なくなって長時間眠れない –

関連する問題