Juliaをもっと速くしよう!
https://zenn.dev/ohno/articles/0ba7970d419898
「多次元配列のメモリ上の位置は Julia, R, Fortran では(Python と違い)列優先なので,bad よりは,内側の for ループでは左側の添字を変化させる good のほうが速い」と書かれている。筆者は Windows のようであり,確かに good のほうが速いという結果が提示されている。
私の環境は Mac mini M1 チップなのだが,両者の違いは殆どなかった。
function bad(arr)
sum = 0
for i in 1:size(arr)[1]
for j in 1:size(arr)[2]
sum += arr[i,j]
end
end
return sum
end
function good(arr)
sum = 0
for j in 1:size(arr)[2]
for i in 1:size(arr)[1]
sum += arr[i,j]
end
end
return sum
end
実は,例に挙げられた関数はもっと早くなる。
sum = 0
を
sum = zero(eltype(arr))
にするだけだ。 sum = 0.0 でもよい。
「Julia は動的型付け言語じゃないか。sum = 0 のどこが悪い?」という人もいると思うが,
sum = 0 だと,sum は Union{Float64, Int64} になってしまう。
sum = zero(eltype(arr)) なら Float64 だ。
余計なことをしないで済むぶん,後者のほうが 6 倍ほど速い。
※コメント投稿者のブログIDはブログ作成者のみに通知されます