ada*_*ien 1 performance r while-loop
for循环在R中非常慢。我想知道while循环是否同样如此。
如果是这样,是否有一种方法可以优化R中的while循环?例如,对于for循环,apply函数发挥出色作用,但我不知道while循环的模拟方式。
甚至哈德利(Hadley)在他的书(《高级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
Run Code Online (Sandbox Code Playgroud)
该while循环需要测试的条件,分配到i和呼叫+在每次迭代。
如果必须使用while循环(通常可以避免循环)并且性能很重要,那么最好的解决方案是将其实现为可从R调用的已编译代码。Rcpp软件包使此操作非常容易。在某些情况下,编译器软件包提供的字节编译也可以加快R循环的速度,但是(写得很好)实际的编译代码总是会更快。
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |