経緯
これまで Python で小規模な数値計算をやってきたが、
- 高速らしい
- 可視化も良さそう
なので Julia を試してみる
インストール
JuliaPro (ディストリビューション)
https://juliacomputing.com/products/juliapro.html
Personal は無料、要ユーザー登録
インストール後、 anaconda の Jupyter notebook を起動すると Julia のカーネルが利用できるようになっている
REPL
Pkg.update() # けっこうかかる
Pkg.add("Plots") # 可視化、フロントエンド
Pkg.add("GR") # 可視化、バックエンド
基本的なこと
- (コンマかセミコロンで区切った)一次元配列は縦ベクトル
- 1-origin
- 配列入力に対してはドット(自動的にブロードキャストされる)
sin.( [1, 3, 7] )
Julia言語で計算が遅くなった場合の解決法
http://nbviewer.jupyter.org/gist/genkuroki/1ac59bb3e03eac12945d7040d4f98246
引数渡しの挙動
- 配列はポインタ(参照?)渡し
- 引数が変更される関数には!をつける
実は NumPy でも同じだが、これまで気づいていなかった
# 数字
function f(x) # コピーが渡される
x += 100 # コピーに変更を加える
end
x = 1
f(x)
x # 1 呼び出し元は変更されない
# 配列
function g!(arr) # アドレス(のコピー?)が渡される
arr[:] += 100 # 呼び出し元に変更を加える
end
arr = [1]
g!(arr)
arr # [101] 呼び出し元が変更されている
関数は遅延評価
これも Python と同じ(だが、以下略)
a = 1
return_a() = a # 関数の短い書き方
a = 2
return_a() # 2
様々な実装と処理時間
KdV 方程式 t=1.2 まで計算
Walkley Scheme, Δt = 1e-5
言語 | 処理時間 | 倍率 | 詳細 |
---|---|---|---|
Python | 19 sec | 1.0x | NumPy convolve1 |
Julia | 50 sec | 0.4x | デフォルトの conv |
Julia | 7.0 sec | 2.7x | FastConv2 |
Julia | 5.6 sec | 3.4x | FastConv + 関数化 |
Julia | 2.9 sec | 6.6x | FastConv + 関数化 + 型指定 |
Julia | 3.1 sec | 6.1x | ベクトルの内積 |
Julia | 230 ms | 82x | for文 |
Julia | 92 ms | 206x | for文 + SIMD |