高效 R 代码写作
Colin Gillespie
Jumping Rivers & Newcastle University

$$ 1, 2, 3, \ldots, n $$
1:n
seq(1, n)
seq(1, n, by = 1)
colon <- function(n) 1:n
colon(5)
1 2 3 4 5
seq_default <- function(n) seq(1, n)
seq_by <- function(n) seq(1, n, by = 1)
system.time(colon(1e8))
# user system elapsed
# 0.032 0.028 0.060
system.time(seq_default(1e8))
# user system elapsed
# 0.060 0.028 0.086
system.time(seq_by(1e8))
# user system elapsed
# 1.088 0.520 1.600
问题在于
system.time(colon(1e8))
没有存储结果。需要重跑并保存结果:
res <- colon(1e8)
<- 运算符可同时执行:
system.time(res <- colon(1e8))
= 运算符只执行下列之一:
# Raises an error
system.time(res = colon(1e8))
| Method | 绝对时间(秒) | 相对时间 |
|---|---|---|
colon(n) |
0.060 | $0.060/0.060 = 1.00$ |
seq_default(n) |
0.086 | $0.086/0.060 = 1.40$ |
seq_by(n) |
1.607 | $1.60/0.060 = 26.7$ |
library("microbenchmark")n <- 1e8 microbenchmark(colon(n), seq_default(n), seq_by(n), times = 10) # 每个函数运行 10 次
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# colon(n) 59 130 220 202 341 391 10 a
# seq_default(n) 94 204 290 337 348 383 10 a
# seq_by(n) 1945 2044 2260 2275 2359 2787 10 b
高效 R 代码写作