[R] Very slow assignments

Rolf Turner rolf.turner at xtra.co.nz
Thu Sep 8 02:22:05 CEST 2011


On 08/09/11 12:05, William Dunlap wrote:
> You did not show the code you used to populate your
> object, but consider the following ways to make as.list(1:50000)
> via repeated assignments:
>
>   >  system.time( { z0<- list() ; for(i in 1:50000)z0[i]<- list(i) } )
>      user  system elapsed
>     13.34    0.00   13.42
>   >  system.time( { z1<- list() ; for(i in 1:50000)z1[[i]]<- i } )
>      user  system elapsed
>     12.98    0.00   13.36
>   >  system.time( { z2<- vector("list",50000) ; for(i in 1:50000)z2[i]<- list(i) } )
>      user  system elapsed
>      0.28    0.00    0.26
>   >  system.time( { z3<- vector("list",50000) ; for(i in 1:50000)z3[[i]]<- i } )
>      user  system elapsed
>      0.22    0.00    0.20
>   >  identical(z0,z1)&&  identical(z0,z2)&&  identical(z0,z3)
>   [1] TRUE
>
> Preallocating a vector to its ultimate size can be much faster than
> repeatedly expanding it.

This is *very* interesting to me.  Years ago I learned to use the ``z1'' 
syntax,
and thought I was being cool.  It's stunning how much more efficient the
``z2'' and ``z3'' syntaxes are.  I'll bet that there are many bunnies 
like me out
there who are unaware of the advantages of preallocation via 
vector("list",...).

Thanks for the enlightenment.

     cheers,

         Rolf Turner



More information about the R-help mailing list