A couple of remarks on vQ's naive benchmark:

f.rep = function(n, m) replicate(n, rnorm(m))

I suppose you meant

        f.rep = function(n, m) replicate(n, mean(rnorm(m)))

which doesn't make a substantial speed difference, though.


f.pat = function(n, m) colMeans(array(rnorm(n*m), c(n, m)))

system.time(f.pat(1000, 1000))
system.time(f.rep(1000, 1000))

makes me believe that there is no significant difference in efficiency
between the 'professionally-looking' replicate-based solution and the
'as fast as possible' pat's solution.


True, I get the same timing results on my machine. But then you should also point out that the original for-loop:

f.for = function(n, m) { res <- numeric(n); for (i in 1:n) res[i] <- mean(rnorm(m)); res }

is exactly as fast as replicate(). So apart from "looking more professional", there isn't any difference between an explicit loop and replicate().

Perhaps loops in R aren't always as slow (compared to matrix operations) as one seemed to think. I ran into a similar issue with a simple benchmark the other day, where a plain loop in Lua was faster than vectorised code in R ...


I have to say, though, that like Patrick I assumed the goal was to obtain a large number of replicates for relatively small sets of random numbers, in which case the matrix solution is indeed faster (though not as much as I would have thought):

> system.time(f.for(100000, 100))
   user  system elapsed
  4.212   0.025   4.273
> system.time(f.rep(100000, 100))
   user  system elapsed
  4.109   0.028   4.172
> system.time(f.pat(100000, 100))
   user  system elapsed
  1.580   0.134   1.739


Best regards,
Stefan Evert

[ stefan.ev...@uos.de | http://purl.org/stefan.evert ]


PS: Don't feed trolls who say that Lua is better than R. ;-)

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to