Re: RE: Product
- To: mathgroup at smc.vnet.net
- Subject: [mg87576] Re: [mg87527] RE: [mg87457] Product
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 13 Apr 2008 03:33:41 -0400 (EDT)
- References: <200804110542.BAA04653@smc.vnet.net> <200804121059.GAA00044@smc.vnet.net> <A76750AA-362E-4C22-9414-2295D5F6AD59@mimuw.edu.pl>
Sorry, I was completly blind when I did the timings. Looking at the results again it is a clear as can be that Times @@ mytestlist is almost an order of magnitude faster then Exp[Total[Log[mytestlist]]]. So at this time I cna see now way to multiply faster than with Times. Andrzej Kozlowski On 12 Apr 2008, at 23:03, Andrzej Kozlowski wrote: > 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 >> >> >> >
- References:
- Product
- From: "Steven" <steven_504@telenet.be>
- RE: Product
- From: "Jose Luis Gomez" <jose.luis.gomez@itesm.mx>
- Product