Rユーザーの9割が知らない高速化の禁断の裏技!!!

この記事はR言語 Advent Calendar 2023の8日目の記事です。
qiita.com

本当に9割が知らないかどうかは知らないです。

R言語は遅い」と言われがちですよね。
個人的には困るほど遅いと感じたことは無いのですが、まあ速いに越したことはありません。

高速化のテクニックも色々あります。

予算がある場合はメモリとCPUを強化するのが手っ取り早いです。
qiita.com

データの読み書きならreadrパッケージでも十分早いし、arrowパッケージという手もあります。
heavywatal.github.io
qiita.com

追記:for文をlapply()やReduce()で高速化する方法もあります!
qiita.com

各種処理ではとにかくベクトル化することが高速化のコツになります。
ベクトル化してください。
ベクトル化しろっつってんだろ。
また、並列化が有効なケースもあるでしょう。

www.slideshare.net
www.slideshare.net

ベクトル化以外にもっと劇的に高速化する方法は無いものでしょうか?

そこで!

禁断の!!

裏技を!!!

使います!!!!

というほどでもないのですが、まあちょっと「自己責任でね!」という感じの技があります。

古より伝わる秘儀BLASの入れ替えです。

まずこちらから最新版のOpenBLASをダウンロードします。
自分のマシンに合ったものをダウンロードしてください。

github.com

解凍してできたbinフォルダの中のlibopenblas.dllというファイルがあります。これをRのbinフォルダにあるRblas.dllと入れ替えます。
不具合が出る可能性もあるので元のRblas.dllは適当にリネームして残しておきましょう。

そしてlibopenblas.dllをRblas.dllがあったフォルダに移動させ、「Rblas.dll」にリネームします。

これで完了です。Rを起動してみましょう。

私の環境では以下のように行列計算が約35倍も高速化しました。

素のR。

x <- matrix(rnorm(9000000),3000,3000)
system.time(tmp <- x %*% x)
# ユーザ   システム       経過  
# 26.74       0.31      27.82 

OpenBLASに差し替え。

x <- matrix(rnorm(9000000),3000,3000)
system.time(tmp <- x %*% x)
# ユーザ   システム       経過  
# 2.56       0.15       0.80 

非公式な方法ですし不具合が出る可能性もありますのであくまでも自己責任でということになりますが、Rの遅さにお悩みの方は試してみてもいいんじゃないでしょうか。

元ネタはこちらです。
www.bilibili.com


Enjoy!