Чому важливо векторизувати ваш код

Ефективне програмування R

Colin Gillespie

Jumping Rivers & Newcastle University

Загальне правило

  • Виклик функції R зрештою веде до коду на C або FORTRAN
    • Цей код дуже сильно оптимізований

Мета

  • Якнайшвидше звертатися до базового коду C або FORTRAN; що менше викликів функцій, то краще.
Ефективне програмування R

Векторизовані функції

  • Багато функцій R векторизовані
    • Приймають одне число, але повертають вектор
rnorm(4)
-0.7247  0.2502  0.3510  0.6919
  • Вектор як вхідні дані
mean(c(36, 48))
42
Ефективне програмування R

Генерація випадкових чисел

library(microbenchmark)
n <- 1e6
x <- vector("numeric", n)
microbenchmark(
    x <- rnorm(n),
    {
        for(i in seq_along(x))
            x[i] <- rnorm(1)
        },
    times = 10
)
# Unit: milliseconds
# expr        lq mean    uq  cld
# rnorm(n)    60   70    80  a
# Looping   2600 2700  2800   b

## Output trimmed for presentation

Порівняйте

x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)

з

x <- rnorm(n)
Ефективне програмування R

Чому цикл повільний?

Цикл
x <- vector("numeric", n)
for(i in seq_along(x))
    x[i] <- rnorm(1)
Виділення пам'яті
x <- vector("numeric", n)
  • Цикл: разова вартість
  • Векторизовано: співмірно
Генерація
  • Цикл: мільйон викликів rnorm()
  • Векторизовано: один виклик rnorm()
Присвоєння
  • Цикл: мільйон викликів операції присвоєння
  • Векторизовано: одне присвоєння
Ефективне програмування R

Клуб R

Друге правило клубу R: використовуйте векторизоване рішення, де тільки можливо.

Ефективне програмування R

Давайте потренуємось!

Ефективне програмування R

Preparing Video For Download...