プログラミングの実験場

Haskell/Webアプリ/画像処理/可視化/ITによる生産性向上 など

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倍の高速化!