Julialangでの配列演算のベクトル化
任意の1変数関数、2変数関数はベクトル化ができ、行列の要素への適用が劇的に高速化する。
julia> A = rand(10000,10000); julia> sq(x) = x*x; julia> sq_vec(x) = x*x; julia> @vectorize_1arg Float64 sq_vec sq_vec (generic function with 4 methods) julia> @time((B=sq(A);)) elapsed time: 26.948158237 seconds (816528604 bytes allocated, 0.06% gc time) julia> @time((B=sq_vec(A);)); elapsed time: 0.520107978 seconds (800380984 bytes allocated)
- 行末のセミコロンは、値の出力をしないという指示(Matlabと同様)。
- @で始まるのはマクロ。
@time
で式の実行時間を計測したり、@allocated
で式の実行時に確保したメモリサイズを表示したりできる。 @time
の中に入れている(B=sq(A);)
というのはcompound expressionといい、複数の式をまとめることができる。(a=1; b=2; a*b)
といった具合。
実行環境はMac mini 2012(Core i7 2.3 GHz)。要素数1億、800 MBのデータに対して0.5秒で済んだ。ベクトル化しない場合に比べて約50倍の高速化!