MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: letrec/named let

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).

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:

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,

  • Prev by Date: Re: Controlled evaluation of functions
  • Next by Date: Re: Boundary conditions in NDSolve
  • Previous by thread: Re: letrec/named let
  • Next by thread: Re: letrec/named let