Я пытаюсь узнать немного Джулии, после прочтения этого руководства в течение нескольких часов, я написал следующий фрагмент кода:Как улучшить производительность этой части кода?
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);
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 ;; ie]] - hy[[1 ;; ie - 1]]);
ez[[1]] = Sin[n/10];
hy[[1 ;; ie]] += (ez[[2 ;; ie + 1]] - ez[[1 ;; ie]]), {n,
steps}]; [email protected]; [email protected]]];
result = fdtd1d[10000]; // AbsoluteTiming
{0.1280000, Null}
Итак, как сделать версию Julia fdtd1d
быстрее?
На моем компьютере это занимает 0.018759438 секунд. Ваш ответ сделал эту часть руководства намного яснее! – xzczd
И хотя я ненавижу это признавать, но когда «шаги» больше, Джулия бьет _Mathematica_ ... для «steps = 10^7' _Mathematica_ занимает около 103 секунд, а Джулии - всего около 19 секунд. – xzczd