「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Juliaを使うときのTipsをまとめる(その11/X)

 \mathrm{Julia}を使うのに、今一度

で使い方を整理する。

注意

 参照文献はかなり古い(2019年)ため、現在のバージョンでは動作しない関数などが多いとの評判がある。そこでそういった齟齬があった場合は随時コメントする。なお筆者の環境は、

アプリケーション バージョン
\mathrm{Julia} 1.8.0
\mathrm{Jupyter} \mathrm{Notebook} 6.5.2

である。

3. Juliaによる数値演算

3.1 行列処理の高速化

 ここではループを用いて行列計算を行う。ここで重要なのは、\mathrm{Julia}では列方向に処理した方が効率が良い点である。

########################
### 行列演算の高速化 ###
########################

# Juliaは列方向での演算が効率的

# 列方向での演算
function sum_by_col(x)
    s = zero(eltype(x)) # コードが型安定にあるようにしている
    for j in 1:size(x, 2)
        for i in 1:size(x, 1)
            s += x[i, j]
        end
    end
    s
end

# 参考:行方向での演算
function sum_by_row(x)
    s = zero(eltype(x)) # コードが型安定にあるようにしている
    for i in 1:size(x,1)
        for j in 1:size(x,2)
            s += x[i,j]
        end
    end
    s
end

using BenchmarkTools
x = rand(10^4, 10^4)

@btime sum_by_row(x)
@btime sum_by_col(x)
@btime sum(x)

println(sum_by_row(x))
println(sum_by_col(x))
println(sum(x))


 上記のように、

  • ① 組み込み関数(\mathrm{sum})
  • ② 列方向で計算する自作関数(\mathrm{sum}_\mathrm{by}_\mathrm{col})
  • ③ 行方向で計算する自作関数(\mathrm{sum}_\mathrm{by}_\mathrm{row})

の順番で計算が速い。また加算する順番が相違するため、浮動小数点数の演算精度により、計算結果が相違している。
 \mathrm{sum}関数は、1つの命令を同時に複数のデータに適用する並列化の形態である\mathrm{SIMD}命令を用いているために自作関数よりも速くなっている。

プライバシーポリシー お問い合わせ