2016-12-02 8 views
1

私は長いベクトルで、すべての要素がTRUEであるかどうかをテストしようとしています。これはかなり起こりそうにないので、私はall(myvector)が1つのFALSE値を見つけるとすぐにFALSEを返すことを望んでいました。それは事実ではないようです。ベクトルのすべての要素がTRUEであることをゆっくりと評価しますか?

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

あなたの例では、時間のほとんどは、ベクターを構築取られています! –

+0

Derp!これを削除する... – Ben

+0

まだ削除しないでください。 –

答えて

3

あなたの例で取られたほとんどの時間は、ベクターを構築することでした。しかし、で説明されているように、Rcppを使ってこのようなことを時々スピードアップすることができます。

any()は、です。それをC++/Rcppで書き直すと、実際にはC++への呼び出しにオーバーヘッドがありますが、非遅延(TRUE-last)のケースではスピードアップします(TRUE-firstの場合)ベース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 
+0

ベンに感謝します。私は恥ずかしい質問を削除したいと思っていましたが、この有益な答えのおかげで今はできません。また、誰かがRcppを提案する気持ちがあった。シンプルで高速な方法を書くための解決策と思われます。 – Ben

関連する問題