ボトルネックの見つけ方

効率的なRコードの書き方

Colin Gillespie

Jumping Rivers & Newcastle University

効率的なRコードの書き方

コードプロファイリング

基本的な考え方は次のとおりです:

  • コードを実行する
  • 数ミリ秒ごとに、現在実行中の処理を記録する
  • Rprof()はRに付属しており、まさにこれを行います
    • 使い方が難しい
  • 代わりに profvis を使用する
効率的なRコードの書き方

IMDBデータセット

  • ggplot2movies パッケージより
data(movies, package = "ggplot2movies")
dim(movies)
58788    24
  • データフレーム:約60,000行・24列
  • 各行は1本の映画に対応
効率的なRコードの書き方

ブレイブハート

braveheart = movies[7288,]
Year Length Rating
1995 177 8.3

効率的なRコードの書き方

例:ブレイブハート

# Load data
data(movies,
     package = "ggplot2movies")
braveheart <- movies[7288,]
movies <- movies[movies$Action==1,]

plot(movies$year, movies$rating, xlab = "Year", ylab = "Rating")
# local regression line model <- loess(rating ~ year, data = movies) j <- order(movies$year) lines(movies$year[j], model$fitted[j], col = "forestgreen")
points(braveheart$year, braveheart$rating, pch = 21, bg = "steelblue")

効率的なRコードの書き方

Profvis

  • RStudio には profvis によるプロファイリング機能が統合されています
    • プロファイリングしたいコードを選択します
    • Profile -> Profile Selected lines

効率的なRコードの書き方

コマンドライン

library("profvis")

profvis({
data(movies, package = "ggplot2movies") # Load data braveheart <- movies[7288,] movies <- movies[movies$Action == 1,] plot(movies$year, movies$rating, xlab = "Year", ylab="Rating") model <- loess(rating ~ year, data = movies) # loess regression line j <- order(movies$year) lines(movies$year[j], model$fitted[j], col="forestgreen", lwd=2) points(braveheart$year, braveheart$rating, pch = 21, bg = "steelblue", cex = 3)
})

最も処理が遅い行はどれだと思いますか?

効率的なRコードの書き方

効率的なRコードの書き方

効率的なRコードの書き方

さあ、練習しましょう!

効率的なRコードの書き方

Preparing Video For Download...