Re: AppendTo VERY slow
- To: mathgroup at smc.vnet.net
 - Subject: [mg35302] Re: AppendTo VERY slow
 - From: "Allan Hayes" <hay at haystack.demon.co.uk>
 - Date: Mon, 8 Jul 2002 03:15:26 -0400 (EDT)
 - References: <ag6ed8$bnm$1@smc.vnet.net>
 - Sender: owner-wri-mathgroup at wolfram.com
 
Mike,
Append is slow, I'll come back to that later, but more importantly here, you
are thinking too procedurally and doing for yourself what Mathematica's
structural manipulation features do much quicker. In  this case all that you
need is to transpose a matrix:
    number =1000;
    xlist = Table[Random[],{number}];
    ylist = Table[Random[],{number}];
    outlist ={};
    Do[elem={xlist[[count]],ylist[[count]]};
      AppendTo[outlist,elem],
      {count,1,number}];//Timing
        {2.31 Second,Null}
Using Transpose:
    (outlist2= Transpose[{xlist,ylist}]);//Timing
        {0. Second,Null}
Check
    outlist===outlist2
        True
If we do have to use Append repeatedly  it is better to use nesting and then
to flatten.
However your example is a bit tricky in that flattening would give just a
list of numbers, but we can get round that by making nest with heads
different from List (here I use the integer 1); then replacing the head  1
with List.
    (outlist3 =1[];
      Do[elem={xlist[[count]],ylist[[count]]};
        outlist3 = 1[outlist3,elem],
        {count,1,number}];
      outlist3 = List@@Flatten[outlist3]);//Timing
        {0.22 Second,Null}
Check
     outlist=== outlist3
        True
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Mike" <M.P.Croucher at Sheffield.ac.uk> wrote in message
news:ag6ed8$bnm$1 at smc.vnet.net...
> I use lists a lot in mathematica and tend to use AppendTo[] a lot in
> my programs.  Recently I wrote a function that i call over and over
> again and found that the results were coming very slowly and i MEAN
> slowly.  I was doing Fourier Transforms and all kinds of stuff so I
> put it down to those at first but I have just put in a load of Print
> statements just after each part of the function to see what was taking
> so long.
>
> I was amazed to see that the Fourier Transforms were so quick and what
> was actually taking the time was a part of my function that collected
> the results togther in the form I wanted and outputted the result.  It
> looks like this
>
> Do[
>     elem = {xlist[[count]], ylist[[count]]]};
>     AppendTo[outlist, elem];
>      , {count, 1, number}
>     ];
>
> It seems that as the list grows it gets slower and slower.  Any tips
> on a way around this would be greatly appreciated (would speed my life
> up no end)
>
>
> Thank
>
> Mike
>