MathGroup Archive 2000

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

Search the Archive

RE: Cases, Throw, and Catch

  • To: mathgroup at smc.vnet.net
  • Subject: [mg24197] RE: [mg24182] Cases, Throw, and Catch
  • From: Wolf Hartmut <hwolf at debis.com>
  • Date: Fri, 30 Jun 2000 01:57:26 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

> -----Original Message-----
> From:	Mark Fisher [SMTP:me.fisher at atl.frb.org]
To: mathgroup at smc.vnet.net
> Sent:	Thursday, June 29, 2000 4:51 AM
> To:	mathgroup at smc.vnet.net
> Subject:	[mg24182] Cases, Throw, and Catch
> 
> I just noticed that it is much faster to Throw and Catch from Cases than
> to have Cases return the first match on its own. Does anyone know why
> this is so and what, if anything, is to be learned?
> 
> Here is the example:
> 
> In[1]:=
> xtab = Table[x, {10^6}];
> 
> In[2]:=
> Cases[xtab, x, Infinity, 1] // Timing
> 
> Out[2]=
> {0.172 Second, {x}}
> 
> In[3]:=
> Catch @ Cases[xtab, Throw[{x}], Infinity, 1] // Timing
> 
> Out[3]=
> {0. Second, {x}}
> 
> In[4]:=
> ytab = Append[xtab, y];
> 
> In[5]:=
> Cases[ytab, y, Infinity, 1] // Timing
> 
> Out[5]=
> {0.437 Second, {y}}
> 
> In[6]:=
> Catch @ Cases[ytab, Throw[{y}], Infinity, 1] // Timing
> 
> Out[6]=
> {0. Second, {y}}
[Wolf Hartmut] 

Hello Mark,

your observation is an optical illusion, see

In[23]:= Attributes[Cases]
Out[23]= {Protected}

So in

In[6]:= Catch at Cases[ytab, Throw[{y}], Infinity, 1] // Timing
Out[6]= {0.01 Second, {y}}

Throw will execute immediately without Cases having worked at all! Compare
this with

In[21]:= Catch at Cases[ytab, y :> Throw[{y}], Infinity, 1] // Timing
Out[21]= {1.242 Second, {y}}

and on my machine I get 

In[5]:= Cases[ytab, y, Infinity, 1] // Timing
Out[5]= {1.232 Second, {y}}

which is fairly consistent. Select however is much slower here

In[10]:= Select[ytab, y === # &, 1] // Timing
Out[10]= {32.307 Second, {y}}

which should not be astonishing for this application. Here two other
procedures to compare

In[16]:= Catch[If[y === #, Throw[{y}]] & /@ ytab] // Timing
Out[16]= {46.396 Second, {y}}

In[19]:= Do[If[y === ytab[[i]], Return[y]], {i, 1, Length[ytab]}] // Timing
Out[19]= {54.087 Second, y}


Kind regards,   Hartmut



  • Prev by Date: Help w DSolve or NDSolve
  • Next by Date: Re: saving notebook files
  • Previous by thread: RE: Cases, Throw, and Catch
  • Next by thread: Re: Cases, Throw, and Catch