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