Re: letrec/named let
- To: mathgroup at smc.vnet.net
- Subject: [mg56795] Re: letrec/named let
- From: Peter Pein <petsie at dordos.net>
- Date: Fri, 6 May 2005 03:00:07 -0400 (EDT)
- References: <d5csm5$m22$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Daniel Roy wrote:
>> ......
>>
>>Neither of these functions do what CompressNumericalSequence does... And
>>because I'm no mathematica-guru I don't yet quite understand what they
>>do, anyway. Furthermore, they are actually SLOWER than my code (see
>>below on a test of 1,000,000 entries).
>>
>>dan
>>
>>
>>
Hello Dan,
somehow the test got lost?! So I've run one on my machine
(Win2k, 512MB Ram, AMD Athlon 64 3000+ @ 2GHz):
In[1]:= $Version
Out[1]= "5.1 for Microsoft Windows (October 25, 2004)"
your original code:
In[2]:=CompressNumericalSequence[S_] :=
Module[{C = Function[{C, R, i}, If[i < Max[R],
If[Length[Position[R, i]] == 0,
C[C, (If[#1 > i, #1 - 1, #1] & ) /@ R, i], C[C, R, i + 1]],
R]]}, C[C, S, 1]];
my code:
In[3]:=
CNS[lst_] := Module[{tmp = First /@ Split[Sort[lst]]},
Flatten[(Position[tmp, #1] & ) /@ lst]]
2 things are missing: a supercomputer and patience.
The test will run on only 10^5 elements.
In[4]:= test = Table[Random[Integer, {1, 5000}], {100000}];
In[5]:= First[Timing[t1 = CompressNumericalSequence[test]; ]]
>From In[5]:=
$IterationLimit::itlim Iteration limit of 4096 exceeded. More...
Out[5]= 25.25*Second
We have to do a special setting to run your code
In[6]:=Block[{$IterationLimit = Infinity},
First[Timing[t1 = CompressNumericalSequence[test]; ]]]
Out[6]= 93.375*Second
In[7]:= $IterationLimit (* is 4096 again *)
Out[7]= 4096
In[8]:= First[Timing[t2 = CNS[test]; ]]
Out[8]= 15.407*Second
test the equality of the results:
In[9]:= t1 == t2
Out[9]= True
Well, I see: it's SLOWER, the result is completely different and I don't
have to tweak Mathematica's default settings to run it at all.
These are three major disadvantages.
Sorry for bothering you,
Peter