[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