2016-12-02 3 views
1

Ich arbeite mit langen Vektoren und versuche zu testen, ob alle ihre Elemente wahr sind. Das ist ziemlich unwahrscheinlich, also habe ich gehofft, all(myvector) würde FALSE zurückgeben, sobald es einen FALSCHEN Wert findet. Das scheint nicht der Fall zu sein.Faul beurteilen, dass alle Elemente eines Vektors wahr sind?

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 

Irgendwie kann ich das beschleunigen?

+0

die meiste Zeit in Ihrem Beispiel wird die Konstruktion der Vektoren genommen! –

+0

Derp! Löschen Sie diese ... – Ben

+0

löschen Sie noch nicht bitte. –

Antwort

3

Die meiste Zeit in Ihrem Beispiel war in der Konstruktion des Vektors. Sie können jedoch manchmal diese Art von Sache mit Rcpp beschleunigen, wie in der Rcpp chapter of Hadley Wickham's Advanced R book erklärt.

Es stellt sich heraus, dass any() faul ist. Das Umschreiben in C++/Rcpp verlangsamt es tatsächlich im trägen (TRUE-first) Fall, weil der Aufruf von C++ etwas Overhead hat, beschleunigt es aber im nicht-trägen (TRUE-last) Fall (meine Vermutung ist dass die Beschleunigung, weil any() in Basis R einige andere Sachen wie Scheck für NA Werte zu tun hat ...)

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

Danke Ben. Ich wollte meine peinliche Frage löschen, aber ich kann jetzt dank dieser informativen Antwort sicherlich nicht. Außerdem hatte ich das Gefühl, dass jemand Rcpp vorschlagen würde. Scheint die erste Wahl zu sein, um einfache, schnelle Methoden zu schreiben. – Ben

Verwandte Themen