gpt4 book ai didi

performance - 关于 Julia 和 Matlab 之间时序比较的奇怪观察

转载 作者:行者123 更新时间:2023-12-02 06:56:38 25 4
gpt4 key购买 nike

这个实验的目的是用下面的一小段代码来比较 Matlab 和 Julia 的速度。

首先是 Matlab 代码:

>> t = 5000; n = 10000;  x = 1:t*n;
>> x = reshape(x, t, n);
>> tic(); y1 = sum(x(:) .* x(:)); toc()
Elapsed time is 0.229563 seconds.
>> y1

y1 =
4.1667e+22
>> tic(); y2 = trace(x * x'); toc()
Elapsed time is 15.332694 seconds.

>> y2
y2 =
4.1667e+22

Julia 中的对战

julia> t = 5000; n = 10000; x = 1: t*n;    
julia> x = reshape(x, t, n);
julia> tic(); y1 = sum(x[:].* x[:]); toc();
elapsed time: 1.235170533 seconds
julia> y1
-4526945843202100544
julia> tic();y2 = trace(x*x'); toc();

第二个没有在超过 1 分钟内完成作业。那么 Julia 是怎么回事呢?这段代码碰巧在 Julia 中运行得既慢又溢出?我的风格有问题吗?我认为从 Matlab 转换到 Julia 的原因之一是速度,我曾经认为 Julia 默认处理大数算术运算。现在看来,这些都不正确。谁能解释一下?

最佳答案

这里发生了几件事。

首先,与 Matlab 不同,x 是一个机器整数数组,而不是浮点值。这似乎是速度上的主要区别,因为它无法将 BLAS 例程用于线性代数。

你需要做任何一个

x = 1.0:t*n

或通过

显式转换
x = float(x)

这也是不同答案的原因:Julia 使用机器算术,对于整数会在溢出时回绕(因此是负数)。浮点值不会有这个问题。

(Julia 确实有任意精度的整数,但默认情况下不会提升:相反,您需要通过 big(n) 自己提升它们)

这会给你一些加速,但你可以做得更好。 Julia 确实需要与 Matlab 略有不同的编程风格。请参阅以上评论中以赛亚提供的链接。

关于你的具体例子

sum(x[:].* x[:])

这很慢,因为它创建了 3 个中间向量(x[:] 的 2 个副本,尽管希望这会在未来及其产品中改变)。

同样,

trace(x*x')

计算一个中间矩阵(其中大部分未在跟踪中使用)。

我的建议是使用

dot(vec(x),vec(x))

vec(x) 只是将 x reshape 为向量(因此无需复制),而 dot 是通常的和积。你也可以“自己动手”:

function test(x)
s = zero(eltype(x)) # this prevents type-instability
for xi in x
s += xi*xi
end
s
end

test(x)

(这需要在 JIT 编译器的函数中才能发挥其魔力)。它应该相当快,尽管可能仍然不如 dot 快,它在底层使用 BLAS 调用。

关于performance - 关于 Julia 和 Matlab 之间时序比较的奇怪观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29932575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com