高效率代码课程目录
Chapter1. Benchmarking
Chapter2. R语言高效化基础
Chapter3. Code的内涵
Chapter4. 多线程计算
R语言其实本质就是一个脚本语言,和C不一样,没法控制内存。不好的指令会浪费很多内存。在R语言中为了实现高速效率化,有三大原则。
1. 绝对不要增长向量(grow vector)
比方说你自定义了一个属于向量增长的函数growing()
n <- 30000
# Slow code
growing <- function(n) {
x <- NULL
for(i in 1:n)
x <- c(x, rnorm(1))
x
}
计算这个函数运行30000次的时间。将近两秒。
system.time(res_grow <- growing(30000))
user system elapsed
1.923 0.000 1.927
作为对比,我们换一种写法,不是通过增长向量,而是提前预设一个向量。
n <- 30000
# Fast code
pre_allocate <- function(n) {
x <- numeric(n) # Pre-allocate
for(i in 1:n)
x[i] <- rnorm(1)
x
}
计算一下运行的时间。只需要0.089秒。
# Use <- with system.time() to store the result as res_allocate
n <- 30000
system.time(res_allocate <- pre_allocate(n))
user system elapsed
0.089 0.000 0.089
2. 尽可能使用向量型计算
简而言之可以不用for
循环的地方就尽量不要用for
循环。比如下面这个几行代码,
x <- rnorm(10)
x2 <- numeric(length(x))
for(i in 1:10)
x2[i] <- x[i] * x[I]
可以被一行所顶替
x2_imp <- x * x
再举个例子来练习一下,x是100个随机数组成的向量,然后需要求每个x的log值的总和。
n <- 100
total <- 0
x <- runif(n)
for(i in 1:n)
total <- total + log(x[I])
改写一下这段代码,写成向量计算模式。
log_sum <- sum(log(x))
3.适时使用矩阵而不是数据框
- 矩阵和数据框的区别
矩阵更加节省内存。不信的话可以比较一下两者需要的时间。
# Which is faster, mat[, 1] or df[, 1]?
microbenchmark(mat[,1], df[,1])
Unit: microseconds
expr min lq mean median uq max neval
mat[, 1] 1.876 2.4270 2.87314 2.6855 3.0100 10.912 100
df[, 1] 9.705 11.7975 13.47467 12.2875 13.1695 106.996 100
网友评论