R中的循环效率低下

SRK*_*RKX 5 loops functional-programming r

早上好,

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

因此,我一直在尝试使用尽可能多的矢量化函数.

但是,我仍然想知道一些事情.

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

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

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

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

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

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

foreach包裹怎么样?您是否通过使用它获得了任何性能提升?

nul*_*lob 6

只是几条评论.一个for循环apply和它的变体大致一样快,当你尽可能地向量化你的函数时(即使用低级循环,而不是apply仅仅隐藏for循环),真正的加速就会出现.我不确定这是否是最好的例子,但请考虑以下事项:

> 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 
Run Code Online (Sandbox Code Playgroud)

在下面的一条评论中,Marek指出for上面循环的耗时部分实际上是]<-部分:

> system.time(sinI <- unlist(lapply(1:n,sin),
+       recursive = FALSE, use.names = FALSE))
   user  system elapsed 
  1.284   0.012   1.303 
Run Code Online (Sandbox Code Playgroud)

无法立即进行矢量化的瓶颈可以在C或Fortran中重写,编译R CMD SHLIB,然后插入.Call,.C.Fortran.

另外,请参阅这些 链接以获取有关R中循环优化的更多信息.另请参阅文章"如何避免此循环或使其更快?" 在R新闻.

  • 在`sapply`版本中,大部分时间花在后处理结果上.当你做`system.time(sinI < - unlist(lapply(1:n,sin),FALSE,FALSE))`你应该得到最快的版本(当然不是来自`sin(1:n)`).在`for`循环耗时是`[< - `,检查`system.time(for(i in 1:n)sin(i))`(在这种情况下是无用的导致丢弃结果). (3认同)