Re: Print[Plot] vs Print[text,Plot]? (*now Do and Table*)

*To*: mathgroup at smc.vnet.net*Subject*: [mg88177] Re: Print[Plot] vs Print[text,Plot]? (*now Do and Table*)*From*: m.r at inbox.ru*Date*: Sun, 27 Apr 2008 04:59:01 -0400 (EDT)*References*: <fupm2j$s4a$1@smc.vnet.net> <fus8g9$850$1@smc.vnet.net>

On Apr 25, 4:32 am, Alexey Popkov <pop... at gmail.com> wrote: > On 24 =C1=D0=D2, 14:06, "W_Craig Carter" <ccar... at mit.edu> wrote: > > > > > (*let's use a do loop*) > > Timing[ > > =9Aicount = 0; > > =9ADo[icount = icount + i, {i, 1, 10000000, 1}]; > > =9Aicount > > =9A] > > > (*this returns {10.2826, 50000005000000} on my machine.*) > > (*10.28 being a measure of how long the computation took to run*) > > > (*lets try a table*) > > Timing[ > > =9ATotal[Table[i, {i, 1, 10000000, 1}]] > > =9A] > > > (*This returns {3.25516, 50000005000000} on my machine*) > > > W. Craig Carter > > Hello, > Lets try the following: > > mmu = MaxMemoryUsed[]; > Timing[icount = 0; > Do[icount = icount + i, {i, 1, 10000000, 1}]; > icount] > MaxMemoryUsed[] - mmu > > (*This returns > {25.657, 50000005000000} > 1118080 > on my machine*) > > mmu = MaxMemoryUsed[]; > Timing[Total[Table[i, {i, 1, 10000000, 1}]]] > MaxMemoryUsed[] - mmu > > (*This returns > {7.651, 50000005000000} > 479959784 > on my machine but takes much more time because of using PAGEFILE*) > > 479959784/1118080=429.271 > Constructing Table takes 429 times more memory than using Do[]! The difference in timings is not surprising: in the example with Do the expression icount = icount + i goes through the interpreter 10^7 times, while in the Table example Plus or Total is only interpreted once and then sent to the low-level code, and additionally Table uses autocompilation. The reason for the memory usage difference is less obvious. Since the result of Total is not a machine number (at least on 32-bit machines), the table is being unpacked and then it takes up (20 bytes per element)*10^7. Apparently a copy is created somewhere along the way, which gives the 400Mb memory footprint. I suppose one can imagine a world where Total doesn't unpack a packed array and doesn't create a copy, but in this case you can avoid the problem by using reals, since the result is a machine real: In[1]:= Timing[Total@ Table[i, {i, 1, 10^7, 1.}]] Out[1]= {1.062, 5.0000005*10^13} In[2]:= MaxMemoryUsed[] Out[2]= 86264744 8*10^7 is the size of one packed array of reals. Or you can use Compile and avoid creating any arrays: In[3]:= Timing[Compile[{}, Module[{n = 10^7, s = 0.}, Do[s += i, {i, 10^7}]; s]][]] Out[3]= {0.609, 5.0000005*10^13} Of course then you might get rounding problems if your result doesn't fit in 53 mantissa bits. Maxim Rytin m.r at inbox.ru