Re: Map vs. Table
- To: mathgroup at smc.vnet.net
- Subject: [mg75392] Re: Map vs. Table
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 28 Apr 2007 05:54:19 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <f0sfrs$ncb$1@smc.vnet.net>
zac wrote:
> Dear Group,
>
> consider a set of data (y values):
>
> data = Table[i*j, {i, 5}, {j, 10}]
>
> I want to label each Integer with an x value:
>
> label := Table[{i, #} & /@ data[[i]], {i, Length[data]}]
>
> I've understand that list creation is much faster with Map than with
> Table.
> Is there an effective way to convert the Table to Map in the label
> function (either with nested Map or to incorporate the Table function
> into the Map)?
> Would it be really faster for very large datasets than with Table?
>
> thanks
>
> Istvan Zachar
>
>
Istvan,
You will not, and cannot, get a straight or definite answer to this kind
of question, because the performances depend on the size of the data set
but also on its /structure/. You will find below some three functions:
label, your original code, label2, a compile version of your original
code, and label3, a function that uses MapIndexed to achieve the same
functionality than your code (note that label3 is the slowest function
in this test).
The first data set has few rows (5) and many columns (100,000). The
compiled version is faster than the regular version.
The second data set has more rows (10) and still many columns (100,000).
label2 is still faster than label.
The third data set has many rows (100,000) and few columns (10). Both
versions are on par. Note that label3 is even slower than during the
precedent test.
In[1]:=
label:=Table[{i,#}&/@data[[i]],{i,Length[data]}]
label2=Compile[{{
data,_Integer,2}},Table[{i,#}&/@data[[i]],{i,Length[data]}]];
label3:=Flatten[MapIndexed[{#2[[1]],#1}&,data,{2}],1]
In[4]:=
Timing[data=Table[i*j,{i,5},{j,10^5}];][[1]]
Timing[label; ][[1]]
Timing[label2[data]; ][[1]]
Timing[label3; ][[1]]
Out[4]=
0.531 Second
Out[5]=
0.109 Second
Out[6]=
0.094 Second
Out[7]=
1.328 Second
In[8]:=
Timing[data=Table[i*j,{i,10},{j,10^5}];][[1]]
Timing[label; ][[1]]
Timing[label2[data]; ][[1]]
Timing[label3; ][[1]]
Out[8]=
1.141 Second
Out[9]=
0.265 Second
Out[10]=
0.235 Second
Out[11]=
3. Second
In[12]:=
Timing[data=Table[i*j,{i,10^5},{j,10}];][[1]]
Timing[label; ][[1]]
Timing[label2[data]; ][[1]]
Timing[label3; ][[1]]
Out[12]=
0.235 Second
Out[13]=
0.265 Second
Out[14]=
0.266 Second
Out[15]=
3.344 Second
Regards,
Jean-Marc