Re: Timing puzzle
- To: mathgroup at smc.vnet.net
- Subject: [mg130436] Re: Timing puzzle
- From: Bob Hanlon <hanlonr357 at gmail.com>
- Date: Thu, 11 Apr 2013 04:11:08 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <20130410045307.C5A526B55@smc.vnet.net>
I've added a couple of additional (faster) methods. You did not indicate the value of n that you used. These timings are with Mathematica v9.0.1.0 on a MacBook Air (2.13 GHz Intel Core 2 Duo; OS X 10.8.3) and n = 10^4. poly initialization (when required) moved inside Timing to level the playing field. Removed unnecessary Print statements. ClearAll[p]; n = 10^4; p[arg_] := { mygraphic[ mycolor[Random[], Random[], Random[]]], mygraphic[ mypoly[{ {Random[], Random[]}, {Random[], Random[]}, {Random[], Random[]}}]]}; Timing[poly = {}; Do[ AppendTo[poly, p[i]], {i, n}]][[1]] Timing[poly = {}; Do[ poly = Append[poly, p[i]], {i, n}]][[1]] Timing[poly = {}; Do[ poly = Join[poly, {p[i]}], {i, n}]][[1]] Timing[poly = {}; Do[ poly = {poly, {p[i]}}, {i, n}]; poly = Flatten[poly]][[1]] Timing[poly = Table[0, {n}]; Do[poly[[i]] = p[i], {i, n}]][[1]] Timing[ poly = Table[p[i], {i, n}]][[1]] Timing[ poly = p /@ Range[n]][[1]] 4.510119 4.384446 4.646620 0.106249 0.089704 0.079244 0.072297 Bob Hanlon On Wed, Apr 10, 2013 at 12:53 AM, <carlos%colorado.edu at gtempaccount.com>wrote: > I am writing a graphics package that often creates objects with thousands > of polygons, possibly up to 10^5. Out of curiosity I tested 5 ways of > dynamically creating a plot list, using AppendTo, Append, Join, etc., and > did the following timing test of 5 ways to do it: > > ClearAll[poly,p,n]; poly={}; n00; > p[arg_]:= {mygraphic[mycolor[Random[],Random[],Random[]]], > mygraphic[mypoly[{{Random[],Random[]}, > {Random[],Random[]},{Random[],Random[]}}]]}; > Print[Timing[Do[AppendTo[poly,p[i]],{i,1,n}]][[1]]]; > ClearAll[poly]; poly={}; > Print[Timing[Do[poly=Append[poly,p[i]],{i,1,n}]][[1]]]; > ClearAll[poly]; poly={}; > Print[Timing[Do[poly=Join[poly,{p[i]}],{i,1,n}]][[1]]]; > ClearAll[poly]; poly={}; > Print[Timing[Do[poly={poly,{p[i]}},{i,1,n}];poly=Flatten[poly]][[1]]]; > ClearAll[poly]; poly=Table[0,{n}]; > Print[Timing[Do[poly[[i]]=p[i],{i,1,n}]][[1]]]; > > Running with n00 on a MacPro under Mac OSX 10.6.8 gives these times: > > 0.911327 Second > 0.891656 Second > 0.927267 Second > 0.504454 Second > 0.009575 Second > > Question: why is the last method much faster? I thought that appending an > object to a list should take about the same time as storing an array entry. > When I worked with linked lists several decades ago (using assembly code > on a CDC 7600) all I had to do is retrieve the object address, manipulate > registers, store in a pointer array, and presto! it was done. > >
- Follow-Ups:
- Re: Timing puzzle
- From: Sseziwa Mukasa <mukasa@gmail.com>
- Re: Timing puzzle
- References:
- Timing puzzle
- From: carlos%colorado.edu@gtempaccount.com
- Timing puzzle