我试图在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
表达只是做一个元件逐元素乘法,而朱莉娅表达确实真矩阵乘法.
您可以通过使用较小的输入来查看差异.这是一个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]])