gpt4 book ai didi

r - R 中的循环效率低下

转载 作者:行者123 更新时间:2023-12-04 17:28:19 25 4
gpt4 key购买 nike

早上好,

我已经在 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

在下面的评论之一中,Marek 指出 for 的耗时部分上面的循环实际上是 ]<-部分:
> system.time(sinI <- unlist(lapply(1:n,sin),
+ recursive = FALSE, use.names = FALSE))
user system elapsed
1.284 0.012 1.303

不能立即向量化的瓶颈可以用 C 或 Fortran 重写,编译为 R CMD SHLIB ,然后插入 .Call , .C.Fortran .

另见 these links有关 R 中循环优化的更多信息。另请查看文章 "How Can I Avoid This Loop or Make It Faster?"在 R 新闻中。

关于r - R 中的循环效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com