Re: Re: recode procedural algorithm to faster functional module
- To: mathgroup at smc.vnet.net
- Subject: [mg44087] Re: [mg44078] Re: recode procedural algorithm to faster functional module
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Wed, 22 Oct 2003 03:24:40 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
I wonder what platform you are using. However, note that the original procedural code was hardly optimized. I deliberately did not change anything but just one look at it suggests the following obvious improvements: procConcurrence = Compile[{{v1, _Real, 2}, {v2, _Real, 2}} , Module[{c = 0}, Do[If[ v1[[i]][[1]] == v2[[k]][[1]] || v1[[i]][[1]] < v2[[k]][[1]] && v1[[i]][[2]] > v2[[k]][[1]] || v1[[i]][[1]] > v2[[k]][[1]] && v1[[i]][[1]] < v2[[k]][[2]], c++], {i, Length[v1], 1, -1}, {k, Length[v2], 1, -1}]; c]]; Now, with exactly the same tests as before and using Peter Pein's faster functional Concurrence I get: In[3]:= v1 = Table[{i - Random[], i + Random[]}, {i, 100}]; v2 = Table[{i - Random[], i + Random[]}, {i, 1000}]; In[5]:= (Timing[#1[v1, v2]] & ) /@ {Concurrence, procConcurrence} Out[5]= {{2.16 Second,214},{0.95 Second,214}} In[6]:= (Timing[#1[v2, v1]] & ) /@ {Concurrence, procConcurrence} Out[6]= {{2. Second,214},{0.9 Second,214}} As you can see, on my machine, the compiled procedural code is over twice as fast. I certainly am not arguing for any superiority of procedural programming, one of the main attractions of Mathematica is in fact that it is not procedural. But in numerical tasks it is pure myth that functional programming has any advantage. Andrzej Kozlowski Yokohama, Japan http://www.mimuw.edu.pl/~akoz/ http://platon.c.u-tokyo.ac.jp/andrzej/ On Tuesday, October 21, 2003, at 03:07 PM, Tom Burton wrote: > On 10/17/03 9:33 PM, in article bmqqcl$rjv$1 at smc.vnet.net, > "Prince-Wright, > Robert G SEPCO" <robert.prince-wright at shell.com> wrote: > >> Can someone please help me recode this Module so it is less procedural >> and hopefully runs a lot faster... > > I find that Peter Pein's solution is both faster than the Compiled > original > but also easier to look at. I would only suggest the following > alternative > when the number of sets becomes large: > > Concurrence6[v1_List, v2_List,nsim_] := Total[ > Take[v1,nsim] /. {a_?AtomQ, b_} :> > Count[Take[v2,nsim] /. {c_?AtomQ, d_} -> (a <= c < b || c < a < > d), > True] > ] > > It is slightly slower, but creates much less temporary storage. > > Tom Burton > > >