2019年5月28日火曜日

[Julia] Juliaの計算の仕組み

Juliaは,
「関数を実行したときに,与えられた引数の型情報を使い,その関数をネイティブコードにコンパイルしてから実行する仕組み」
なので,高速に計算したい場合は関数化して計算する必要があります.

以下に,円周率のモンテカルロ計算を実行した時にかかる時間の計測例を示します.
(オリジナルは,黒木玄さんの「JuliaとJupyterのすすめ」にあるコードを転用してREPLで確認)

円周率のモンテカルロ計算を関数化せずに実行する場合
julia> @time begin
       L = 10^7
       c = 0
       for i in 1:L
       global c
       c += ifelse(rand()^2+rand()^2 ≤ 1, 1, 0)
       end
       4c/L
       end
  1.940780 seconds (40.00 M allocations: 762.914 MiB, 1.05% gc time)
3.13768

関数化して実行場合する場合
julia> function simpi(L=10^7)
       c = 0
       for i in 1:L
       c += ifelse(rand()^2+rand()^2 ≤ 1, 1, 0)
       end
       4c/L
       end
simpi (generic function with 2 methods)

julia> @time simpi(10^5)
  0.020499 seconds (25.11 k allocations: 1.288 MiB)
3.12924

実行環境にもよりますが,上記の例では処理速度が,数十倍も違うことが確認できるはずです.
なお,オリジナルの,黒木玄さんの「JuliaとJupyterのすすめ」には,gccと比較しても断然速いことが示されていいます.

ただし,gccで適切なライブラリを選定すると,Juliaより速く計算できる例も示されていますが,最適なライブラリ設定は面倒な(というよりわからない)事も多々あるので,Juliaで計算することのメリットを実感することができます.

上記の例のJupyter Notebookファイルは,GitHubMechanism of calculation.ipynbというファイルで見ることができます.

0 件のコメント :

コメントを投稿