我对 R 的性能有疑问: 这是我的脚本。
问题是我需要在拥有约 600 万客户的基础上使用它(每个客户一个线性模型),而且处理时间很长。
谁能帮助我提高脚本的性能?我认为问题出在data.frame rbind功能上。
我对 R 的性能有疑问: 这是我的脚本。
问题是我需要在拥有约 600 万客户的基础上使用它(每个客户一个线性模型),而且处理时间很长。
谁能帮助我提高脚本的性能?我认为问题出在data.frame rbind功能上。
实际上,您的脚本中存在一些问题,并且不断增长的对象(无论是使用rbind()还是bind_rows())都会严重影响您的性能。因此,如果您知道自己有多少行,请先创建一个包含那么多行的对象。
接下来,您依赖数据框。如果您只是将信息存储在单独的向量中并且最后只将它们组合起来,那么您将再次消除大量开销。看看以下三个模型示例:
library(rbenchmark)
library(dplyr)
# The naive way
f1 <- function(n){
out <- data.frame(x = numeric(), y = numeric())
for(i in seq.int(n)){
tmp <- data.frame(x = rnorm(1), y=rnorm(1))
out <- bind_rows(out, tmp)
}
return(out)
}
# Preallocating memory
f2 <- function(n){
out <- data.frame(x = numeric(n), y = numeric(n))
for(i in seq.int(n)){
out$x[i] <- rnorm(1)
out$y[i] <- rnorm(1)
}
return(out)
}
# Using vectors
f3 <- function(n){
outx <- numeric(n)
outy <- numeric(n)
for(i in seq.int(n)){
outx[i] <- rnorm(1)
outy[i] <- rnorm(1)
}
return(data.frame(x = outx, y = outy))
}
在我的机器上,我得到以下时间:
benchmark(
f1(100),
f2(100),
f3(100),
columns = c("test","elapsed","relative","replications")
)
## test elapsed relative replications
## 1 f1(100) 2.16 27.00 100
## 2 f2(100) 0.34 4.25 100
## 3 f3(100) 0.08 1.00 100
仅仅改变它已经可以严重减少你的运行时间。