Re: Performance of Array Addition
- To: mathgroup at smc.vnet.net
- Subject: [mg90964] Re: Performance of Array Addition
- From: "Jean-Marc Gulliet" <jeanmarc.gulliet at gmail.com>
- Date: Fri, 1 Aug 2008 02:58:49 -0400 (EDT)
- References: <g6rnv9$7lj$1@smc.vnet.net> <489189A1.2000307@gmail.com>
Jeremy wrote: > Let there be, for example, an array of reals with dimensions > {d1,d2,3}. > > I have noticed that the command > > array[[All,All,1]] + array[[All,All,2]] + array[[All,All,3]]; > > is much faster than > > Map[Total, array, {2}]; > > even though they return the same answer. > > The advantage of Map[Total, array, {2}] is that it allows arrays of > dimension {d1,d2,d3}, with d3 arbitrary. > > Is there a way to get closer to the speed advantages of hand-coding > the addition of the final dimension, while > allowing the number of elements in the final dimension to be > arbitrary? Why not using the second argument of Total[]? Total[array, {3}] The above expression is scalable and on average three times faster than the hand-coded solution. In[1]:= array = RandomReal[{-1, 1}, {100, 50, 3}]; Timing[tot1 = array[[All, All, 1]] + array[[All, All, 2]] + array[[All, All, 3]]; ][[1]] Timing[tot2 = Map[Total, array, {2}]; ][[1]] Timing[tot3 = Total[array, {3}]; ][[1]] tot1 == tot2 == tot3 Out[2]= 0.00095 Out[3]= 0.010702 Out[4]= 0.000432 Out[5]= True In[6]:= Table[(array = RandomReal[{-1, 1}, {100, 50, 3}]; t1 = Timing[array[[All, All, 1]] + array[[All, All, 2]] + array[[All, All, 3]]; ][[1]]; t2 = Timing[Map[Total, array, {2}]; ][[1]]; t3 = Timing[Total[array, {3}]; ][[1]]; {t1 , t2 , t3}), {10}] Out[6]= {{0.000772, 0.009676, 0.000262}, {0.000771, 0.009517, 0.000257}, {0.000739, 0.009531, 0.000262}, {0.000794, 0.00963, 0.00026}, {0.000766, 0.009561, 0.000284}, {0.000812, 0.009681, 0.000264}, {0.00074, 0.009579, 0.000261}, {0.000823, 0.009585, 0.000266}, {0.000751, 0.009764, 0.00029}, {0.000807, 0.009716, 0.000276}} In[7]:= Mean[%] Out[7]= {0.0007775, 0.009624, 0.0002682} Regards, -- Jean-Marc