質問: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は、少なくとも、ある程度取り組んでいることを示唆していると思う複数のコア、全体に分散されている両方:
それは私が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']
アップルとオレンジの古い比較... – Bakuriu
@バクリュウ私はそれを助けることができないようです。古い習慣は、明らかに難しい。 –