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 at gmail.com> wrote:> > On Sun, Sep 23, 2018 at 10:09 AM Wensui Liu <liuwensui at 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 at gmail.com> wrote: > >> > >> On Sat, Sep 22, 2018 at 9:06 PM Wensui Liu <liuwensui at 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 at 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 at 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 at 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.
On Sun, Sep 23, 2018 at 1:46 PM Wensui Liu <liuwensui at 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.046Your 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 at gmail.com> wrote: > > > > On Sun, Sep 23, 2018 at 10:09 AM Wensui Liu <liuwensui at 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 at gmail.com> wrote: > > >> > > >> On Sat, Sep 22, 2018 at 9:06 PM Wensui Liu <liuwensui at 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 at 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 at 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 at 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.
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? On Sun, Sep 23, 2018 at 1:18 PM Ista Zahn <istazahn at gmail.com> wrote:> > On Sun, Sep 23, 2018 at 1:46 PM Wensui Liu <liuwensui at 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 at gmail.com> wrote: > > > > > > On Sun, Sep 23, 2018 at 10:09 AM Wensui Liu <liuwensui at 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 at gmail.com> wrote: > > > >> > > > >> On Sat, Sep 22, 2018 at 9:06 PM Wensui Liu <liuwensui at 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 at 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 at 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 at 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.