Re: ConstantArray and List
- To: mathgroup at smc.vnet.net
- Subject: [mg88184] Re: [mg88156] ConstantArray and List
- From: Carl Woll <carlw at wolfram.com>
- Date: Sun, 27 Apr 2008 05:00:19 -0400 (EDT)
- References: <200804260746.DAA08772@smc.vnet.net>
Szabolcs Horvát wrote: >Consider the following inputs: > >In[1]:= ConstantArray[f[], {5}] > >Out[1]= {f[], f[], f[], f[], f[]} > >In[2]:= ConstantArray[List[], {5}] > >During evaluation of In[2]:= ConstantArray::scalar: Argument {} at \ >position 1 is not a scalar. >> > >Out[2]= ConstantArray[{}, {5}] > > >Why doesn't the second one work? Is this because of the way packed >arrays are handled (just a guess)? > > >What is the advantage of ConstantArray over Table or Array? It doesn't >seem to be much faster, and it doesn't seem to return an array stored in >a more efficient way (I experimented a little with MemoryInUse[]). > > Try comparing ConstantArray and Table for the creation of very large packed arrays: In[41]:= ConstantArray[0, 10^7]; // Timing Table[0, {10^7}]; // Timing Out[41]= {0.031,Null} Out[42]= {0.531,Null} In[43]:= ConstantArray[1., {10^4, 10^3}]; // Timing Table[1., {10^4}, {10^3}]; // Timing Out[43]= {0.062,Null} Out[44]= {0.531,Null} So, ConstantArray is useful when you want to create a large constant packed array, which you then modify in some way. This approach is very common in Compile code. Another example is: In[51]:= r1 = Table[ConstantArray[i, 10^6], {i, 10}]; // Timing r2 = Table[i, {i, 10}, {10^6}]; // Timing r1 === r2 Out[51]= {1.84075*10^-13,Null} Out[52]= {1.844,Null} Out[53]= True although here, I should mention that neither r1 nor r2 are packed. Carl Woll Wolfram Research
- References:
- ConstantArray and List
- From: Szabolcs Horvát <szhorvat@gmail.com>
- ConstantArray and List