while循环和R中的for循环一样慢吗?

ada*_*ien 1 performance r while-loop

for循环在R中非常慢。我想知道while循环是否同样如此。

如果是这样,是否有一种方法可以优化R中的while循环?例如,对于for循环,apply函数发挥出色作用,但我不知道while循环的模拟方式。

甚至哈德利(Hadley)在他的书(《高级R》)中对于如何优化while循环也很模糊。

Rol*_*and 5

“对于R,循环很慢。” 那是完全错误的。for循环很快。您在循环内执行的操作很慢(与矢量化操作相比)。我希望while循环比循环要慢,for因为它需要在每次迭代之前测试条件。请记住,R是一种解释型语言,即没有编译器优化。同样,R中的函数调用本身并不慢,但是在函数调用期间仍然有很多事情在进行,这加起来。向量化操作避免了重复的函数调用。

很难在两个循环结构之间进行公平的比较,但是在这里我们开始:

library(microbenchmark)

microbenchmark(
  for (i in seq_len(1e6)) i,
  {i <- 1; while (i <= 1e6) {i <- i+1}},
  times = 10, unit = "relative"
)

#Unit: relative
#                                                             expr      min       lq    mean   median       uq      max neval cld
#                                      for (i in seq_len(1e+06)) i 1.000000 1.000000 1.00000 1.000000 1.000000  1.00000    10  a 
# {     i <- 1     while (i <= 1e+06) {         i <- i + 1     } } 8.987293 8.994548 9.14089 9.019795 9.036116 10.07227    10   b
Run Code Online (Sandbox Code Playgroud)

while循环需要测试的条件,分配到i和呼叫+在每次迭代。

如果必须使用while循环(通常可以避免循环)并且性能很重要,那么最好的解决方案是将其实现为可从R调用的已编译代码。Rcpp软件包使此操作非常容易。在某些情况下,编译器软件包提供的字节编译也可以加快R循环的速度,但是(写得很好)实际的编译代码总是会更快。