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