Skip to main content
 首页 » 编程设计

python之Julia 矩阵乘法比 numpy 的慢

2025年05月04日14jpfss

我正在尝试在 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 版本似乎有什么问题?!

请您参考如下方法:

我不认为他们在做同样的事情。 numpy 表达式只是执行逐个元素的乘法,而 Julia 表达式执行真正的矩阵乘法。

您可以通过使用较小的输入来查看差异。这是 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 中做同样的事情时会发生什么:

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]])