问题:
1)当使用BLAS时,numpy.dot()
怎么比下面示例代码中的*
慢?在
2)在这种情况下,是否有一种方法可以实现numpy.dot()
,而不是{
详情如下。提前感谢您的回答和帮助。在
详细信息:
我正在编写一个程序,它使用Python2.7(64位)、Numpy1.11.2、Windows7上的Anaconda2来解决耦合的PDE。为了提高程序输出的精度,我需要使用大数组(shape(2,2^14)和较小的积分步骤,从而导致每个模拟的数组乘法运算数量巨大,我需要对其速度进行优化。在
有了looked around,似乎只要安装BLAS并使用numpy,numpy.dot()
就应该用于相对于*
更快的数组乘法。这是经常推荐的。但是,当我使用下面的计时器脚本时,*
比numpy.dot()
快至少7倍。在某些情况下,这会增加到系数>1000:
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
该输出:
^{pr2}$numpy.dot()
和{
看看numpy.__config__.show()
我似乎在使用BLAS和lapack(尽管不是openblas_lapack?)公司名称:
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']
np.dot
调用矩阵矩阵乘法,而*
是元素乘法。对于python3.5+,矩阵矩阵乘法的符号是@
。在相关问题 更多 >
编程相关推荐