while循环和R中的for循环一样慢吗?
For循环在R中非常慢。我想知道while循环是否也是如此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是一种解释语
如果是这样,有没有一种方法可以优化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++了解很少)。