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

while循环和R中的for循环一样慢吗?,r,performance,while-loop,R,Performance,While Loop,For循环在R中非常慢。我想知道while循环是否也是如此 如果是这样,有没有一种方法可以优化R中的while循环?例如,对于For循环,apply函数起到了很好的作用,但我不知道while循环有什么类似的功能 即使是Hadley在他的书(Advanced R)中也对如何优化while循环非常模糊。“因为循环在R中非常慢。”这完全是错误的for循环速度很快。在循环中执行的操作很慢(与矢量化操作相比)。我希望while循环比for循环慢,因为它需要在每次迭代之前测试一个条件。请记住,R是一种解释语

For循环在R中非常慢。我想知道while循环是否也是如此


如果是这样,有没有一种方法可以优化R中的while循环?例如,对于For循环,apply函数起到了很好的作用,但我不知道while循环有什么类似的功能


即使是Hadley在他的书(Advanced R)中也对如何优化while循环非常模糊。

“因为循环在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
库(微基准)
微基准(
对于(以下第(1e6)节中的i)i,

{i“已知For循环在R中相当慢。”这完全是错误的。
For
循环很快。你在循环中做的事情很慢(与向量化操作相比)。我希望
while
循环比
for
循环慢,因为它需要在每次迭代之前测试一个条件。请记住,R是一种解释语言,即没有编译器优化。此外,R中的函数调用本身并不慢,但在函数调用期间仍有很多事情要做,而且ad矢量化操作避免了重复的函数调用

很难对这两种循环构造进行公平的比较,但现在我们开始:

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
库(微基准)
微基准(
对于(以下第(1e6)节中的i)i,

{i“For循环在R中相当慢。”这完全是错误的。
For
循环很快。你在循环中做的事情很慢(与向量化操作相比)。我希望
while
循环比
for
循环慢,因为它需要在每次迭代之前测试一个条件。请记住,R是一种解释语言,即没有编译器优化。@Roland你认为如果我们要为二分法编写while循环,例如,如果我们优化在while循环中,我们可以实现适当的速度?
apply
不比for
循环快:“例如,对于for循环,apply函数发挥了很好的作用,但我不知道while循环有什么类似的功能。”不,
apply
永远不会比编写良好的
for
循环快。当然,它有助于避免使用
for
循环(如生长对象)时出现的一些常见错误。“for循环在R中非常慢。”这完全是错误的。
for
循环速度很快。你在循环中所做的事情很慢(与矢量化操作相比)。我希望
while
循环比
for
循环慢,因为它需要在每次迭代之前测试一个条件。请记住,R是一种解释语言,即没有编译器优化。@Roland你认为如果我们要为二分法编写while循环,例如,如果我们优化在while循环中,我们可以实现适当的速度?
apply
不比for
循环快:“例如,对于for循环,apply函数发挥了很好的作用,但我不知道while循环有什么类似的功能。”不,<代码>应用决不会比循环写得好的<代码>。当然,它有助于避免使用<代码> > <代码>循环(比如生长对象)的一些常见错误。谢谢回答,但我仍不明白为什么循环不慢。如果你考虑这个例子,n=1000000和=0系统。时间(i(1):n){sum=sum+i})system.time(cumsum(as.numeric(1:n)))它们实际上比较慢,但在forYou have n(实际上是2乘以n)中似乎没有任何不必要的操作实现与一个函数调用相同的函数调用。为什么您对后者的速度感到惊讶?在编译代码中,它一定比解释代码快。@RHertel我认为
for
循环有各种各样的优化。如果它真的检查索引是否在范围内,我会感到惊讶。是的,当然当然,如果字节编译(即<代码>编译器//COD>包)有帮助,或者可以使用Rcpp(如果你有一些C/C++的最小知识)。谢谢你的回答,但是我仍然不知道为什么循环不是慢的。如果你考虑这个例子,n=1000000和= 0系统。时间(for(i,在1:n){和= +SUM +i})系统。时间(CUUMUM(AS,数字(1:N))))它们实际上比较慢,但在forYou have n(实际上是2乘以n)中似乎没有任何不必要的操作实现与一个函数调用相同的函数调用。为什么您对后者的速度感到惊讶?在编译代码中,它一定比解释代码快。@RHertel我认为
for
循环有各种各样的优化。如果它真的检查索引是否在范围内,我会感到惊讶。是的,当然当然。如果字节编译(即
编译器
包)有帮助,您可以尝试,或者您可以使用Rcpp(如果您对C/C++了解很少)。