[R] speeding up

Ken Knoblauch ken.knoblauch at inserm.fr
Mon Oct 21 23:04:21 CEST 2013


Ken Knoblauch <ken.knoblauch <at> inserm.fr> writes:

> 
> Bos, Roger <roger.bos <at> rothschild.com> writes:
> > I am using a sum of squared differences in the 
> objective function of an optimization problem I am 
> doing and I
> > have managed to speed it up using the
>  outer function versus the nested for loops, but my 
> suspicion is that
> > the calculation could be done even quicker.  
> Please see the code below for a simple example.  If 
> anyone can
> 
> > point out a faster way I would appreciate it greatly.
> > 
> > Thanks,
> > 
> > Roger
> > 
> > X <- runif(1000)
> > 
> > now <- proc.time()
> > ans <- 0
> > for (i in 1:length(X)) {
> >   for (j in 1:length(X)) {
> >     ans <- ans + (X[i]-X[j])*(X[i]-X[j])
> >   }
> > }
> > ans
> > speed <- proc.time() - now; cat(" That took ", 
> round(speed[3],1), " secs.\n", sep="")
> > 
> > now <- proc.time()
> > gg <- outer(X, X, FUN="-")
> > sum(gg*gg)
> > speed <- proc.time() - now; cat(" That took ", 
> round(speed[3],1), " secs.\n", sep="")
> > 
> > 
> 
> system.time(
> for (i in 1:length(X)) {
>   for (j in 1:length(X)) {
>     ans <- ans + (X[i]-X[j])*(X[i]-X[j])
>   }
> })
>    user  system elapsed 
>   2.241   0.009   2.293 
> 
> system.time(2 * sum(c(dist(X))^2))
> 
>    user  system elapsed 
>   0.038   0.002   0.040 
> 
> and then there is Rcpp if you want to add
> some extra grease.
> 

and just to follow-up on my own suggestion

library(Rcpp)

cppFunction('
	double ss(NumericVector X){
		int n = X.size();
		double total = 0;
		for(int i = 0; i < n; i++)
	   		for(int j = 0; j < n; j++)
	     total += (X[i] - X[j]) * (X[i] - X[j]);
		return total;
	}'
)

system.time(ss(X))
   user  system elapsed 
  0.002   0.000   0.002 

-- 
Kenneth Knoblauch
Inserm U846
Stem-cell and Brain Research Institute
Department of Integrative Neurosciences
18 avenue du Doyen Lépine
69500 Bron
France
tel: +33 (0)4 72 91 34 77
fax: +33 (0)4 72 91 34 61
portable: +33 (0)6 84 10 64 10
http://www.sbri.fr/members/kenneth-knoblauch.html



More information about the R-help mailing list