2013-02-14 13 views
9

Porównałem wydajność wbudowanych funkcji R rnorm, qnorm i pnorm do równoważnych funkcji Matlaba.R vs. Matlab: Wyjaśnienie różnicy prędkości dla funkcji rnorm, qnorm i pnorm

Wygląda na to, że funkcje i pnorm są 3-6 razy wolniejsze w R niż w Matlabie, natomiast funkcja qnorm ma wartość ok. 40% szybciej w R. Wypróbowałem pakiet Rcpp, aby przyspieszyć funkcje R, używając odpowiednich bibliotek C, co spowodowało zmniejszenie czasu pracy o ~ 30%, które jest nadal znacznie wolniejsze niż Matlab dla rnorm i pnorm.

Czy jest dostępny pakiet, który zapewnia szybszy sposób symulacji normalnie rozłożonych zmiennych losowych w R (inny niż przy użyciu standardowej funkcji rnorm)?

+2

już zapewne zorientowali się już to, ale inna rzecz, aby pamiętać, że zbieranie duży blok liczb losowych jest * * wiele szybciej niż w R zbierając je jeden po drugim .. tzn. 'rnorm (1e6)' jest znacznie szybszy niż 'vapply (seq (1e6), function (i) rnorm (1), numeric (1))' –

Odpowiedz

9

Aby promować mój komentarz do odpowiedzi: tak, jest.

library("sos"); findFn("Ziggurat") znajduje funkcję rziggurat w pakiecie SuppDists; jest realizowany w C (lub C++?), a jego dokumentacja mówi

tym bieganie realizacja w R jest około trzy razy szybko jak rnorm().

Drugą kwestią zasługującą na uwagę, co może zrobić tyle samo lub więcej różnica w praktyce, jest to, że zbieranie duży blok liczb losowych jest znacznie szybszy niż w R zbierając je jeden po drugim ... czyli rnorm(1e6) jest znacznie szybciej niż vapply(seq(1e6),function(i) rnorm(1),numeric(1))

library("SuppDists") 
library("rbenchmark") 
n <- 1e5 
benchmark(rziggurat(n), 
      rnorm(n), 
      vapply(seq(n),function(x) rnorm(1),numeric(1))) 

##   test elapsed relative user.self 
## 2  rnorm(n)  1.138  13.233  1.140 
## 1 rziggurat(n)  0.086  1.000  0.088 
## 3 vapply(...) 29.043 337.709 29.046 
+0

Dzięki Ben za tę podpowiedź! To faktycznie poprawia środowisko wykonawcze o współczynnik 6 na moim komputerze. Może jest inny pakiet, który również poprawia środowisko wykonawcze dla funkcji pnorm? – user1372987

+0

Należy pamiętać, że ta implementacja Ziggurat działa tylko w 32-bitowych systemach operacyjnych. Na początku tego roku wprowadziłem coś lepszego na CRAN w [RcppZiggurat] (http://dirk.eddelbuettel.com/code/rcpp.ziggurat.html). –

10

widzę tu dwie odrębne kwestie, po jednym w każdym akapicie:

  • Tak, istnieje różnica pomiędzy językami/systemami, takimi jak R i Matlab. Część tego ma do czynienia z tłumaczem, prędkością pętli, szybkością wywoływania funkcji itp. Pp. Rcpp może w tym pomóc w odniesieniu do Matlaba, który ma oryginalny kompilator JIT. Mamy porównanie między Matlab, R i R + Rcpp dla filtru Kalmana w najnowszym artykule na temat RcppArmadillo.

  • Istnieją również różnice w ukrytym skompilowanym kodzie, i tak, R nie zawsze ma szybszą implementację, ponieważ R Core (IMHO słusznie) idzie na precyzję jako pierwszy. (A Rcpp nie pomaga sam w sobie: po prostu nazywamy to, co R wewnętrznie.) Pojawiło się na przykład z przykładem Samblera Gibbsa dla MCMC, który rozpoczął Darren Wilkinson. Zauważyłem, że R's rgamma() jest znacznie wolniejsza niż inne systemy. Tak więc, aby uzyskać odpowiedź na pytanie dotyczące N (0,1), rysowanie odbywa się szybciej: myślę, że potrzebujemy wniesionej wkładki do Zigguratu. Jest to jeden z szybszych generatorów N (0,1) i używa go kilka innych systemów.

+0

Rzeczywiście: 'library (" sos "); findFn ("Ziggurat") 'znajduje http://finzi.psych.upenn.edu/R/library/SuppDists/html/ziggurat.html, który mówi:" Ta implementacja działająca w R jest około trzy razy szybsza niż rnorm() . " –

+0

Dzięki, Ben. Myślę, że kiedyś wiedziałem o tym, ale zapisałem go pod "dobry, a teraz potrzebuję go z C++ ..." i zapomniałem. –

+0

prawdopodobnie mógłbyś ukraść kod - to GPL ... –