Eduardo:

On Wed, Nov 17, 2010 at 9:53 AM, Eduardo de Oliveira Horta
<eduardo.oliveiraho...@gmail.com> wrote:
> Thanks.
>
> I wanted to avoid loops (even inside functions) because I thought they were
> much slower than vector operations, and I really need an efficient code (not
> an exercise!).

This is a common miconception. What is true is that (internally)
vectorized functions -- which are loops in the **compiled C or Fortran
code -- are much faster than interpreted (at the R level) loops. So,
for example:

> system.time (y <- sin(seq_len(1e6)))
   user  system elapsed
   0.14    0.00    0.14
> y <- vector(length=1e6)
> system.time (for(i in seq_len(1e6))y[i] <- sin(i))
   user  system elapsed
   4.84    0.02    4.88

But Reduce(), Vectorize, and anything in the apply family **are**
(disguised) loops at the interpreted level (albeit done efficiently).
They have to be, since they are designed to work with arbitrary user
provided functions. So, continuing the example above, caclulating the
signs with sapply is no more efficient than using the explicit loop:

> system.time(sapply(seq_len(1e6),sin))
   user  system elapsed
   4.54    0.05    4.59


R also permits direct recursive implementation of loops; but because
of the heavy internal bookkeeping involved, this tends to be still
more inefficient.

Finally, IMO Bill Dunlap's pronouncements on R matters should always
be viewed as authoritative and generally also recommended R
programming practice. Therefore anything I say that conflicts with his
comments is wrong.

Cheers,
Bert


Bert Gunter
Genentech Nonclinical statistics

______________________________________________
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