最初这是mathematica.SE 中出现的一个问题,但由于讨论涉及多种编程语言,我认为最好稍微改一下措辞并将其发布在这里。
简而言之,michalkvasnicka在以下 MATLAB 示例中发现
s = 15000;
tic
% for-loop version
H = zeros(s,s);
for c = 1:s
for r = 1:s
H(r,c) = 1/(r+c-1);
end
end
toc
%Elapsed time is 1.359625 seconds.... For-loop
tic;
% vectorized version
c = 1:s;
r = c';
HH=1./(r+c-1);
toc
%Elapsed time is 0.047916 seconds.... Vectorized
isequal(H,HH)
Run Code Online (Sandbox Code Playgroud)
矢量化代码段比纯 for 循环代码段快 25 倍以上。虽然我无法访问 MATLAB,因此无法亲自测试示例,但时间1.359625
似乎表明它是在普通 PC 上进行测试的,就像我的一样。
但我无法用 Fortran 或 Julia 等其他语言重现时间!(我们知道,他们俩都以数值计算的性能而闻名。好吧,我承认我绝不是 fortran 或 julia 的专家。)
以下是我用于测试的样本。我使用的是配备 i7-8565U CPU、Win 10 …
我正在探索Julia的并行计算,并尝试了这个:
a=dzeros(5);a[1]=5
Run Code Online (Sandbox Code Playgroud)
但只是得到了这个错误:
Run Code Online (Sandbox Code Playgroud)setindex! not defined for DArray{{Float64, 1, Array{Float64, 1}}
好吧,我认为手册说setindex!
是完全实现的DArray
.我错过了什么?
我在Windows 32位上使用v0.2.1.
我正在尝试学习一点Julia,在阅读了几个小时的手册之后,我写了下面这段代码:
ie = 200;
ez = zeros(ie + 1);
hy = zeros(ie);
fdtd1d (steps)=
for n in 1:steps
for i in 2:ie
ez[i]+= (hy[i] - hy[i-1])
end
ez[1]= sin(n/10)
for i in 1:ie
hy[i]+= (ez[i+1]- ez[i])
end
end
@time fdtd1d(10000);
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)elapsed time: 2.283153795 seconds (239659044 bytes allocated)
我相信它在优化之下,因为它比相应的Mathematica版本要慢得多:
ie = 200;
ez = ConstantArray[0., {ie + 1}];
hy = ConstantArray[0., {ie}];
fdtd1d = Compile[{{steps}},
Module[{ie = ie, ez = ez, hy = hy},
Do[ez[[2 ;; ie]] += (hy[[2 …
Run Code Online (Sandbox Code Playgroud)