R中的循环效率低下

时间:2010-06-28 02:59:27

标签: r functional-programming loops

早上好,

我在R中开发了几个月,我必须确保代码的执行时间不会太长,因为我分析了大数据集。

因此,我一直在努力使用尽可能多的矢量化函数。

然而,我仍然想知道一些事情。

R中代价高昂的不是循环本身吗? 我的意思是,当您开始修改循环中的变量时会出现问题,例如是否正确?

因此我在想,如果你只需要在每个元素上运行一个函数(你实际上并不关心结果)会怎么样。例如,在数据库中写入数据。你应该怎么做?

1)使用mapply而不将结果存储在任何地方?

2)在向量上做一个循环,只对每个元素应用f(i)?

3)我可能错过了更好的功能吗?

(当然假设你的功能没有最佳矢​​量化)。

foreach套餐怎么样?您是否通过使用它来改善性能?

2 个答案:

答案 0 :(得分:6)

只是几条评论。 for循环与apply及其变体一样快,当您尽可能地向量化函数时(即使用低级循环,而不是{ {1}},它只隐藏apply循环)。我不确定这是否是最好的例子,但请考虑以下几点:

for

在下面的一条评论中,Marek指出上面> n <- 1e06 > sinI <- rep(NA,n) > system.time(for(i in 1:n) sinI[i] <- sin(i)) user system elapsed 3.316 0.000 3.358 > system.time(sinI <- sapply(1:n,sin)) user system elapsed 5.217 0.016 5.311 > system.time(sinI <- unlist(lapply(1:n,sin), + recursive = FALSE, use.names = FALSE)) user system elapsed 1.284 0.012 1.303 > system.time(sinI <- sin(1:n)) user system elapsed 0.056 0.000 0.057 循环的耗时部分实际上是for部分:

]<-

无法立即进行矢量化的瓶颈可以在C或Fortran中重写,使用> system.time(sinI <- unlist(lapply(1:n,sin), + recursive = FALSE, use.names = FALSE)) user system elapsed 1.284 0.012 1.303 进行编译,然后插入R CMD SHLIB.Call.C

另外,有关R中循环优化的详细信息,请参阅these links。另请参阅R News中的文章"How Can I Avoid This Loop or Make It Faster?"

答案 1 :(得分:4)

vapply通过要求您指定返回值是什么来避免后处理。 事实证明它比for循环快3.4倍:

> system.time(for(i in 1:n) sinI[i] <- sin(i))
   user  system elapsed 
   2.41    0.00    2.39 

> system.time(sinI <- unlist(lapply(1:n,sin), recursive = FALSE, use.names = FALSE))
   user  system elapsed 
   1.46    0.00    1.45 

> system.time(sinI <- vapply(1:n,sin, numeric(1)))
   user  system elapsed 
   0.71    0.00    0.69