当前位置:  开发笔记 > 编程语言 > 正文

Julia矩阵乘法比numpy慢

如何解决《Julia矩阵乘法比numpy慢》经验,为你挑选了1个好方法。

我试图在Julia中进行一些矩阵乘法,以便将其与numpy进行对比.

我的Julia代码如下:

function myFunc()
  A = randn(10000, 10000)
  B = randn(10000, 10000)
  return A*B
end

myFunc()

而python版本是:

A = np.random.rand(10000,10000)
B = np.random.rand(10000,10000)
A*B

Python版本需要不到100毫秒才能执行.Julia版本需要超过13秒!看到他们在引擎盖下使用几乎相同的BLAS技术,似乎是Julia版本的问题?!



1> senderle..:

我不认为那些做同样的事情.的numpy表达只是做一个元件逐元素乘法,而朱莉娅表达确实真矩阵乘法.

您可以通过使用较小的输入来查看差异.这是一个numpy例子:

>>> A
array([1, 2, 3])
>>> B
array([[1],
       [2],
       [3]])
>>> A * B
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])
>>> B * A
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

请注意,这里我们有广播,它"模拟"两个向量的外积,所以你可能会认为它是矩阵乘法.但它不可能,因为矩阵乘法不是可交换的,而且在这里(A * B) == (B * A).看看在朱莉娅做同样事情时会发生什么:

julia> A = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> B = [1 2 3]
1x3 Array{Int64,2}:
 1  2  3

julia> A * B
3x3 Array{Int64,2}:
 1  2  3
 2  4  6
 3  6  9

julia> B * A
1-element Array{Int64,1}:
 14

在这里,B * A为您提供正确的点积.numpy.dot如果你想要真正的比较,请尝试.

如果您使用的是Python 3.5或更高版本,您还可以使用新的内置点积运算符!只需确保矩阵的形状对齐:

>>> A
array([[1, 2, 3]])
>>> B
array([[1],
       [2],
       [3]])
>>> A @ B
array([[14]])
>>> B @ A
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有