Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

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

Search the Archive

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



  • 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