如何找出瓶頸?

撰寫高效 R 程式碼

Colin Gillespie

Jumping Rivers & Newcastle University

撰寫高效 R 程式碼

程式剖析(profiling)

基本概念是:

  • 執行程式碼
  • 每隔數毫秒記錄當前執行內容
  • Rprof() 內建於 R,正是做這件事
    • 不太好用
  • 改用 profvis
撰寫高效 R 程式碼

IMDB 資料集

  • 來自 ggplot2movies 套件
data(movies, package = "ggplot2movies")
dim(movies)
58788    24
  • 資料框:約 60,000 列、24 欄
  • 每列對應一部電影
撰寫高效 R 程式碼

Braveheart

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

撰寫高效 R 程式碼

範例:Braveheart

# 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...