[R] For Loop

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Tue Sep 25 10:50:49 CEST 2018


>>>>> Wensui Liu 
>>>>>     on Sun, 23 Sep 2018 13:26:32 -0500 writes:

    > what you measures is the "elapsed" time in the default
    > setting. you might need to take a closer look at the
    > beautiful benchmark() function and see what time I am
    > talking about.

    > I just provided tentative solution for the person asking
    > for it and believe he has enough wisdom to decide what's
    > best. why bother to judge others subjectively?  

Well, because  Ista Zahn is much much much better R programmer
than you, sorry to be blunt!

Martin

    > On Sun, Sep 23, 2018 at 1:18 PM Ista Zahn <istazahn using gmail.com>
    > wrote:
    >> 
    >> 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.

    > ______________________________________________
    > 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