懒惰地评估一个向量的所有元素都是真的吗?

时间:2016-12-02 04:22:00

标签: r

我正在使用长向量,尝试测试其所有元素是否都为TRUE。这恰好是不太可能的,所以我希望all(myvector)一发现一个FALSE值就会返回FALSE。情况似乎并非如此。

system.time( all(rep(T, 100000000)) )
   user  system elapsed 
  0.321   0.102   0.423 

system.time( all(c(F, rep(T, 100000000), F)) )
   user  system elapsed 
  0.444   0.211   0.655 

任何方式我都可以加快速度吗?

1 个答案:

答案 0 :(得分:3)

您的示例中花费的大部分时间都是构建向量。但是,有时你可以使用Rcpp加速这种事情,如Rcpp chapter of Hadley Wickham's Advanced R book中所述。

事实证明any() 是懒惰的。在C ++ / Rcpp中重写它实际上会在延迟(TRUE-first)情况下减慢它,因为对C ++的调用有一些开销,但是在非延迟(TRUE-last)情况下加速它(我的猜测是加速是因为基地R中的any()必须做一些其他事情,例如检查NA值......)

x3 <- c(TRUE, rep(FALSE,1e7)) ## fast if lazy
x4 <- c(rep(FALSE,1e7),TRUE)
library(Rcpp)
cppFunction("
bool any_C(LogicalVector x) {
  return is_true(any(x));
}")

library(microbenchmark)
microbenchmark(any(x3),any(x4),any_C(x3),any_C(x4))
      expr       min         lq        mean     median         uq       max
   any(x3)     1.224     1.6210     7.70592     9.1690    10.6430    53.431
   any(x4) 18255.964 19069.7740 20104.43401 19501.6215 20028.3585 35843.360
 any_C(x3)     2.850     4.3735    15.94341    14.4195    24.1195    85.295
 any_C(x4)  7782.388  8279.9395  8832.22210  8700.9380  9161.2205 12339.606