SRK*_*RKX 5 loops functional-programming r
早上好,
我在R中开发了几个月,我必须确保代码的执行时间不会太长,因为我分析了大数据集.
因此,我一直在尝试使用尽可能多的矢量化函数.
但是,我仍然想知道一些事情.
R中代价高昂的不是循环本身吗?我的意思是,当您开始在循环中修改变量时出现问题,例如是否正确?
因此我在思考,如果你只需要在每个元素上运行一个函数(你实际上并不关心结果)会怎么样.例如,在数据库中写入数据.你该怎么办?
1)使用mapply而不将结果存储在任何地方?
2)在向量上做一个循环,只对每个元素应用f(i)?
3)我可能错过了更好的功能吗?
(当然假设你的功能没有最佳矢量化).
foreach包裹怎么样?您是否通过使用它获得了任何性能提升?
只是几条评论.一个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新闻.