Re: RE: Product

*To*: mathgroup at smc.vnet.net*Subject*: [mg87575] Re: [mg87527] RE: [mg87457] Product*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Sun, 13 Apr 2008 03:33:30 -0400 (EDT)*References*: <200804110542.BAA04653@smc.vnet.net> <200804121059.GAA00044@smc.vnet.net>

The reason for the speed of Total unlike Plus is that it does not need to unpack packed arrays. Here is how you can see what happens. SetSystemOptions["PackedArrayOptions" -> {"UnpackMessage" -> True}]; mytestlist = Table[RandomInteger[{1, 9}], {1000000}]; Developer`PackedArrayQ[mytestlist] True So mytestlist is a packed array. Now let's see what happens if we add it up using Plus: In[4]:= Plus @@ mytestlist During evaluation of In[4]:= Developer`FromPackedArray::"unpack1" : "Unpacking array." During evaluation of In[4]:= Developer`FromPackedArray::"punpack1" : "Unpacking array to Out[4]= 4998322 Now the same with Total: In[5]:= Total[mytestlist] Out[5]= 4998322 It is the unpacking of packed arrays by Plus that makes adding up this list using Plus much slower. As for multiplying: I can't think of any way to multiply the elements of a list without unpacking. However, if, as in your example, the list contains only positive numbers the following will still beat Times (though not by much): Timing[b = Exp[Total[Log[mytestlist]]]; ] During evaluation of In[3]:= Developer`FromPackedArray::"unpack1" : "Unpacking array." During evaluation of In[3]:= Developer`FromPackedArray::"unpack" : "Unpacking array in call to Log {2.0021780000000007, Null} while In[4]:= Timing[a = Times @@ mytestlist; ] During evaluation of In[4]:= Developer`FromPackedArray::"unpack1" : "Unpacking array." During evaluation of In[4]:= Developer`FromPackedArray::"punpack1" : "Unpacking array to level 1 {0.30934300000000015, Null} a == b True If there is a method of multiplying without unpacking it should be a lot faster but at least at this moment I can't think of one. Andrzej Kozlowski On 12 Apr 2008, at 19:59, Jose Luis Gomez wrote: > (* Steven *) > (* I think it is an interesting question *) > (* See what happens when we compare total with other ways to add > many small > integers *) > > (* First a test list:*) > > In[1]:= mytestlist = Table[RandomInteger[{1, 9}], {1000000}]; > > (* add all the numbers in the list, and also report the computer > time used > to calculate:*) > > In[2]:= Timing[Plus @@ mytestlist] > > Out[2]= {0.266, 5003966} > > (* AGAIN add all the numbers in the list, BUT THIS TIME USING TOTAL > and also > report the computer time used to calculate:*) > > In[3]:= Timing[Total[mytestlist]] > > Out[3]= {0.031, 5003966} > > (* As you can see, for small integers, Total has a special algorithm > that > that adds ten times faster than just add all the numbers in order*) > (* Therefore your question is equivalent to ask if there is an > improved > algorithm to multiply numbers, and if that algorithm is implemented > in a > special command in Mathematica, equivalent to Total*) > > (* I do not know the answer, while someone else answers this, you can > multiply the following way:*) > > In[4]:= Times @@ mytestlist > > (* large result deleted *) > > (* The following link might be interesting for you:*) > (* http://homepage.cem.itesm.mx/lgomez/matecmatica/fp/fp.html *) > (* http://homepage.cem.itesm.mx/lgomez/matecmatica/funcionalprog.nb *) > > (* Hope that helps *) > (* Jose *) > (* Mexico *) > > -----Mensaje original----- > De: Steven [mailto:steven_504 at telenet.be] > Enviado el: Viernes, 11 de Abril de 2008 12:43 a.m. > Para: mathgroup at smc.vnet.net > Asunto: [mg87457] Product > > Silly beginner's question: is there a function to multiply all > elements of a > list, like Total does for addition? > 'fraid I can't find it. > TIA > > >

**Follow-Ups**:**Re: Re: RE: Product***From:*Carl Woll <carlw@wolfram.com>

**References**:**Product***From:*"Steven" <steven_504@telenet.be>

**RE: Product***From:*"Jose Luis Gomez" <jose.luis.gomez@itesm.mx>