首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么a.dot(b)比a@b快,尽管Numpy推荐a@b

为什么a.dot(b)比a@b快,尽管Numpy推荐a@b
EN

Stack Overflow用户
提问于 2018-08-28 16:27:12
回答 2查看 12.6K关注 0票数 17

根据这个问题numpy的答案,与a.dot(b)相比,二维阵列的矩阵乘法最好是通过a @ bnumpy.matmul(a,b)来完成。

如果a和b都是二维数组,则是矩阵乘法,但首选使用matmul或a@b。

我做了下面的基准,并发现了相反的结果。

问题:我的基准测试有什么问题吗?如果没有,为什么Numpy不推荐a.dot(b),因为它比a@bnumpy.matmul(a,b)更快

基准使用python3.5numpy 1.15.0。

代码语言:javascript
运行
复制
$ pip3 list | grep numpy
numpy                         1.15.0
$ python3 --version
Python 3.5.2

基准代码:

代码语言:javascript
运行
复制
import timeit

setup = '''
import numpy as np
a = np.arange(16).reshape(4,4)
b = np.arange(16).reshape(4,4)
''' 
test = '''
for i in range(1000):
    a @ b
'''
test1 = '''
for i in range(1000):
    np.matmul(a,b)
'''
test2 = '''
for i in range(1000):
    a.dot(b)
'''

print( timeit.timeit(test, setup, number=100) )
print( timeit.timeit(test1, setup, number=100) )
print( timeit.timeit(test2, setup, number=100) )

结果:

代码语言:javascript
运行
复制
test  : 0.11132473500038031
test1 : 0.10812476599676302
test2 : 0.06115105600474635

添加结果:

代码语言:javascript
运行
复制
>>> a = np.arange(16).reshape(4,4)
>>> b = np.arange(16).reshape(4,4)
>>> a@b
array([[ 56,  62,  68,  74],
       [152, 174, 196, 218],
       [248, 286, 324, 362],
       [344, 398, 452, 506]])
>>> np.matmul(a,b)
array([[ 56,  62,  68,  74],
       [152, 174, 196, 218],
       [248, 286, 324, 362],
       [344, 398, 452, 506]])
>>> a.dot(b)
array([[ 56,  62,  68,  74],
       [152, 174, 196, 218],
       [248, 286, 324, 362],
       [344, 398, 452, 506]])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-28 16:34:06

你的前提是不正确的。您应该使用更大的矩阵来度量性能,以避免函数调用使微不足道的计算相形见绌。

使用Python3.60/ NumPy 1.11.3,您将发现,正如解释过的这里一样,@调用np.matmul,两者都优于np.dot

代码语言:javascript
运行
复制
import numpy as np

n = 500
a = np.arange(n**2).reshape(n, n)
b = np.arange(n**2).reshape(n, n)

%timeit a.dot(b)        # 134 ms per loop
%timeit a @ b           # 71 ms per loop
%timeit np.matmul(a,b)  # 70.6 ms per loop

还请注意,正如在文档中所解释的,np.dot在功能上不同于@ / np.matmul。特别是,它们对维数大于2的矩阵的处理方式不同。

票数 29
EN

Stack Overflow用户

发布于 2018-08-28 16:35:38

matmuldot不做同样的事情。它们的行为与3D数组和标量不同。文档可能会指出,matmul是首选的,因为它更“清晰”和一般,不一定出于性能的原因。如果文档能更清楚地说明为什么其中一种比另一种更好,那就太好了。

正如@jpp所指出的那样,matmul的性能实际上不一定更差。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52062496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档