Re: List concatenation speed
- To: mathgroup at smc.vnet.net
- Subject: [mg87597] Re: [mg87571] List concatenation speed
- From: Carl Woll <carlw at wolfram.com>
- Date: Mon, 14 Apr 2008 05:42:31 -0400 (EDT)
- References: <200804130732.DAA11515@smc.vnet.net>
carlos at Colorado.EDU wrote:
>I am building mesh plots that require concatenation of thousands of
>Graphics objects into one list for Show[]. This is done by appending
>objects as they are created, and there are several ways to do that.
>Tested 3 of them for speed using a simple object:
>
> p=Table[x,{50}]; n=10000;
> ClearAll[poly]; poly={};
> Print[Timing[Do[AppendTo[poly,p],{i,1,n}]]];
> ClearAll[poly]; poly={};
> Print[Timing[Do[poly=Append[poly,p],{i,1,n}]]];
> ClearAll[poly]; poly={};
> Print[Timing[Do[poly=Join[poly,{p}],{i,1,n}]]];
>
>{5.8395 Second,Null}
>{5.7206 Second,Null}
>{6.29728 Second,Null}
>
>Tests were run on version 5.2 on a G5 desktop Mac. I expected Join to
>win,
>but it didnt. Is there a faster way?
>
>
Each of your examples is basically doing an Append operation 10000
times, and unfortunately, Append is one of the slowest Mathematica
operations.
For your toy example, simply:
poly = Table[p, {n}];
is practically instantaneous and produces the same answer:
In[901]:= p = Table[x, {50}]; n = 10000;
ClearAll[poly]; poly = {};
Timing[Do[AppendTo[poly, p], {i, 1, n}]]
Timing[poly2 = Table[p, {n}];]
poly === poly2
Out[903]= {4.281,Null}
Out[904]= {0.,Null}
Out[905]= True
For your real application, the best way to do things depends critically
on what object you are trying to create. If at all possible, you should
use multipoint, multiline or multipolygon objects to take advantage of
packed arrays.
Carl Woll
Wolfram Research
- References:
- List concatenation speed
- From: carlos@Colorado.EDU
- List concatenation speed