【问题标题】:R - apply or for loop depending on results of previous iterationsR - 根据先前迭代的结果应用或 for 循环
【发布时间】:2018-06-01 20:10:24
【问题描述】:

我目前正在解决一个问题,即我执行多个功能被迭代执行。对于每次迭代,输入取决于前一次运行的结果。目前我使用了一个“for循环”,但是为了加快运行速度,我有兴趣用一个apply函数替换这个循环。

apply 函数通常不会将全局环境参数的更改考虑在内。但是可以直接更改全局变量。因此,下面的代码是相同的。

a <- 1

sapply(seq_len(5), function(x){
  a <<- a + 1
})

a <- 1

for(i in seq_len(5)){
  a <- a + 1
} 

从 for 循环更改为可直接更改全局变量的 apply 函数会导致计算时间减少吗?

【问题讨论】:

  • sapply 会比循环快得多,这是一种谬论。您应该尝试优化实际上需要时间的代码,而不是尝试通过更改迭代方式来节省每次迭代 1 微秒。查看“代码分析”(here's a good link to get you started) 以获取有关如何识别代码慢速部分的指导。

标签: r for-loop apply


【解决方案1】:

不,不会更快。

我们可以使用microbenchmark 包进行比较:

n = 1e5
microbenchmark::microbenchmark(sapply = {
    a <- 1
    sapply(seq_len(n), function(x) {
        a <<- a + 1
    })
},
forloop = {
    a <- 1
    for (i in seq_len(n)) {
        a <- a + 1
    }
})
# Unit: milliseconds
#     expr       min        lq      mean    median         uq        max neval cld
#   sapply 55.081023 67.740821 86.924793 78.312672 100.079169 424.137078   100   b
#  forloop  3.950579  4.267804  4.666161  4.492243   4.764634   8.714735   100  a 

平均而言,sapply 版本在长度为 100k 的输入上比for 循环版本慢近 20 倍。全局分配显然很昂贵,当我还尝试使用&lt;&lt;- 运行for循环时,差异接近3倍。

但是这种区别基本上是没有意义的。如果我们查看每次迭代,sapply 代码需要 0.078 秒 / 100k 次迭代 = 每次迭代 780 纳秒。 for 循环每次迭代需要 40 纳秒。您的实际代码希望做的事情比单个添加更有趣,所以它可能需要几微秒,或者更可能是几毫秒,甚至几秒钟!每次迭代。

如果你想加速代码,你需要加速实际上需要时间的部分,而不是通过改变你的方式来尝试每次迭代几百纳秒(仍然小于 1 微秒)正在迭代。查看“代码分析”(here's a good link to get you started) 以获取有关如何识别代码慢速部分的指导。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2019-06-01
    • 1970-01-01
    • 2016-02-16
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多