向量化代码的重要性

高效 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 代码写作

¡Vamos a practicar!

高效 R 代码写作

Preparing Video For Download...