Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化numpy数组乘法:*比numpy.dot快?_Python_Arrays_Performance_Numpy_Blas - Fatal编程技术网

Python 优化numpy数组乘法:*比numpy.dot快?

Python 优化numpy数组乘法:*比numpy.dot快?,python,arrays,performance,numpy,blas,Python,Arrays,Performance,Numpy,Blas,问题: 1) 当使用BLAS时,为什么numpy.dot()比下面示例代码中的*慢 2) 在这种情况下,有没有一种方法可以实现numpy.dot()而不是*,从而更快地实现数组乘法?我认为我遗漏了一条关键信息,这将回答问题1,这意味着numpy.dot()至少与*一样快,如果不是更快的话 详情如下。提前感谢您的回答和帮助 详细信息: 我正在编写一个程序,在Windows7上使用Python2.7(64位)、Numpy1.11.2和Anaconda2解决耦合PDE。为了提高程序输出的准确性,我需要

问题:

1) 当使用BLAS时,为什么
numpy.dot()
比下面示例代码中的
*

2) 在这种情况下,有没有一种方法可以实现
numpy.dot()
而不是
*
,从而更快地实现数组乘法?我认为我遗漏了一条关键信息,这将回答问题1,这意味着
numpy.dot()
至少与
*
一样快,如果不是更快的话

详情如下。提前感谢您的回答和帮助

详细信息:

我正在编写一个程序,在Windows7上使用Python2.7(64位)、Numpy1.11.2和Anaconda2解决耦合PDE。为了提高程序输出的准确性,我需要使用大数组(shape(2,2^14)和更大的数组)和小的积分步骤,从而在每次模拟中产生大量的数组乘法运算,我需要对其速度进行优化

现在看来,只要安装了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
这将产生:

Time for np.dot:  8.58201189949e-05
Time for *:  1.07564737429e-05
dotTime / starTime:  7.97846218436
numpy.dot()
*
都分布在多个内核中,我认为这表明BLAS在某种程度上起作用,至少:

查看
numpy.\uuuu config\uuuuu.show()
似乎我正在使用BLAS和lapack(虽然不是openblas\u lapack?):


np.dot
调用矩阵乘法,而
*
是元素乘法。对于Python 3.5+,矩阵乘法的符号是
@

np。dot
调用矩阵乘法,而
*
是元素乘法。对于Python3.5+,矩阵乘法的符号是
@

苹果和橙子之间的古老比较…@Bakuriu我似乎忍不住要这么做。显然,旧习惯很难改掉。苹果和橙子之间的旧比较…@Bakuriu我似乎忍不住要这么做。很明显,旧习惯很难改掉。很好,谢谢。指出愚蠢的错误总是好的!新规则:多睡觉,少咖啡因,在长途跋涉之前,所以…非常好,谢谢。指出愚蠢的错误总是好的!新规则:在长时间发帖之前多睡觉少咖啡因。。。
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']