[R] For Loop

Ista Zahn |@t@z@hn @end|ng |rom gm@||@com
Sun Sep 23 20:18:25 CEST 2018


On Sun, Sep 23, 2018 at 1:46 PM Wensui Liu <liuwensui using gmail.com> wrote:
>
> actually, by the parallel pvec, the user time is a lot shorter. or did
> I somewhere miss your invaluable insight?
>
> > c1 <- 1:1000000
> > len <- length(c1)
> > rbenchmark::benchmark(log(c1[-1]/c1[-len]), replications = 100)
>                   test replications elapsed relative user.self sys.self
> 1 log(c1[-1]/c1[-len])          100   4.617        1     4.484    0.133
>   user.child sys.child
> 1          0         0
> > rbenchmark::benchmark(pvec(1:(len - 1), mc.cores = 4, function(i) log(c1[i + 1] / c1[i])), replications = 100)
>                                                                test
> 1 pvec(1:(len - 1), mc.cores = 4, function(i) log(c1[i + 1]/c1[i]))
>   replications elapsed relative user.self sys.self user.child sys.child
> 1          100   9.079        1     2.571    4.138      9.736     8.046

Your output is mangled in my email, but on my system your pvec
approach takes more than twice as long:

c1 <- 1:1000000
len <- length(c1)
library(parallel)
library(rbenchmark)

regular <- function() log(c1[-1]/c1[-len])
iterate.parallel <- function() {
  pvec(1:(len - 1), mc.cores = 4,
       function(i) log(c1[i + 1] / c1[i]))
}

benchmark(regular(), iterate.parallel(),
          replications = 100,
          columns = c("test", "elapsed", "relative"))
##                 test elapsed relative
## 2 iterate.parallel()   7.517    2.482
## 1          regular()   3.028    1.000

Honestly, just use log(c1[-1]/c1[-len]). The code is simple and easy
to understand and it runs pretty fast. There is usually no reason to
make it more complicated.
--Ista

> On Sun, Sep 23, 2018 at 12:33 PM Ista Zahn <istazahn using gmail.com> wrote:
> >
> > On Sun, Sep 23, 2018 at 10:09 AM Wensui Liu <liuwensui using gmail.com> wrote:
> > >
> > > Why?
> >
> > The operations required for this algorithm are vectorized, as are most
> > operations in R. There is no need to iterate through each element.
> > Using Vectorize to achieve the iteration is no better than using
> > *apply or a for-loop, and betrays the same basic lack of insight into
> > basic principles of programming in R.
> >
> > And/or, if you want a more practical reason:
> >
> > > c1 <- 1:1000000
> > > len <- 1000000
> > > system.time( s1 <- log(c1[-1]/c1[-len]))
> >    user  system elapsed
> >   0.031   0.004   0.035
> > > system.time(s2 <- Vectorize(function(i) log(c1[i + 1] / c1[i])) (1:len))
> >    user  system elapsed
> >   1.258   0.022   1.282
> >
> > Best,
> > Ista
> >
> > >
> > > On Sun, Sep 23, 2018 at 7:54 AM Ista Zahn <istazahn using gmail.com> wrote:
> > >>
> > >> On Sat, Sep 22, 2018 at 9:06 PM Wensui Liu <liuwensui using gmail.com> wrote:
> > >> >
> > >> > or this one:
> > >> >
> > >> > (Vectorize(function(i) log(c1[i + 1] / c1[i])) (1:len))
> > >>
> > >> Oh dear god no.
> > >>
> > >> >
> > >> > On Sat, Sep 22, 2018 at 4:16 PM rsherry8 <rsherry8 using comcast.net> wrote:
> > >> > >
> > >> > >
> > >> > > It is my impression that good R programmers make very little use of the
> > >> > > for statement. Please consider  the following
> > >> > > R statement:
> > >> > >          for( i in 1:(len-1) )  s[i] = log(c1[i+1]/c1[i], base = exp(1) )
> > >> > > One problem I have found with this statement is that s must exist before
> > >> > > the statement is run. Can it be written without using a for
> > >> > > loop? Would that be better?
> > >> > >
> > >> > > Thanks,
> > >> > > Bob
> > >> > >
> > >> > > ______________________________________________
> > >> > > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > >> > > 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.
> > >> >
> > >> > ______________________________________________
> > >> > R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > >> > 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.




More information about the R-help mailing list