Rozszerzenie na moim komentarzu do odpowiedzi chris_dubois jest, tutaj niektóre informacje taktowania:
> system.time(res <- rnorm(50000) - rnorm(50000))
user system elapsed
0.06 0.00 0.06
Kontrast to z FN3 z tą samą odpowiedź:
> system.time(res3 <- fn3(50000))
user system elapsed
1.33 0.01 1.36
pierwszą rzeczą, aby zauważyć, że kolanach góra jest wolniejsza od maszyny chris_dubois.:)
Drugim i ważniejszym punktem jest to, że podejście wektorowe, mające tu zastosowanie, jest o rząd wielkości szybsze. (Zwrócił także uwagę Richie Cotton w komentarzu do tej samej odpowiedzi).
To doprowadza mnie do ostatniego punktu: to mit że apply
i jego przyjaciele są znacznie szybsze niż for
pętli w R. Są w tej samej kolejności, w większości pomiarów widziałem. Ponieważ są tylko for
pętle za kulisami. Zobacz także tego posta:
http://yusung.blogspot.com/2008/04/speed-issue-in-r-computing-apply-vs.html
Według profesora Briana Ripley "apply() jest tylko nakładką na pętli." Jedyną korzyścią wynikającą z zastosowania apply() jest to, że czyni twój kod bardziej uporządkowanym!
Dokładnie. Powinieneś użyć apply
, jeśli jest bardziej ekspresowy , zwłaszcza jeśli programujesz w stylu funkcjonalnym. Nie dlatego, że jest szybszy.
Co jest nie tak z drugą odpowiedzią w tym wątku listy R: res <- rnorm (10^6) -rnorm (10^6)? – ars
@ars: Masz całkowitą rację - to daje najszybsze rozwiązanie (o rząd wielkości). Najlepszą radą będzie 1. Użyj funkcji, które naturalnie działają na wektorach (jak robi to rnorm); 2. W przeciwnym razie użyj funkcji * * apply; 3. W przeciwnym razie użyj pętli for z wcześniejszą alokacją. –