我正在使用长向量,尝试测试其所有元素是否都为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
任何方式我都可以加快速度吗?
答案 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