LoginSignup
7
9

More than 5 years have passed since last update.

Julia を使って計算の高速化

Posted at

経緯

これまで 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
kdv.png

言語 処理時間 倍率 詳細
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
7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9