[R] For Loop
Wensui Liu
||uwen@u| @end|ng |rom gm@||@com
Sun Sep 23 19:46:32 CEST 2018
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
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