Как найти узкое место?

Эффективный код на 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 столбцов
  • Каждая строка соответствует отдельному фильму
Эффективный код на R

Braveheart

braveheart = movies[7288,]
Год Длина Рейтинг
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...