Re: Function with optional default argument cannot cache results
- To: mathgroup at smc.vnet.net
- Subject: [mg130680] Re: Function with optional default argument cannot cache results
- From: Sseziwa Mukasa <mukasa at gmail.com>
- Date: Wed, 1 May 2013 21:40:50 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-outx@smc.vnet.net
- Delivered-to: mathgroup-newsendx@smc.vnet.net
- References: <20130501073754.8ADA36A27@smc.vnet.net>
On May 1, 2013, at 3:37 AM, Dan O'Brien <danobrie at gmail.com> wrote: > Is there a discussion somewhere on why this is? > > In[1]:= $Version > f[x_, y_: 2] := f[x, y] = {Pause[1], x, y} > f[1, 2] // AbsoluteTiming > f[1, 2] // AbsoluteTiming > f[1] // AbsoluteTiming > f[1] // AbsoluteTiming > > Out[1]= "9.0 for Microsoft Windows (64-bit) (January 25, 2013)" > > Out[3]= {1.014002, {Null, 1, 2}} > > Out[4]= {0., {Null, 1, 2}} > > Out[5]= {1.029602, {Null, 1, 2}} > > Out[6]= {1.014002, {Null, 1, 2}} > The value that's cached for f[1,2] is {Null,1,2} not {Pause[1],1,2}. Out[4] returns the cached value, f[1] doesn't match the cached pattern so f[x_,y_:2] is evaluated again in the case of Out[5] and Out[6]. You can see this by looking at the DownValues of f: (Debug) In[7]:= DownValues[f] (Debug) Out[7]= {HoldPattern[f[1, 2]] :> {Null, 1, 2}, HoldPattern[f[x_, y_ : 2]] :> (f[x, y] = {Pause[1], x, y})} It's not clear what you are trying to accomplish, perhaps you want: (Debug) In[39]:= f[x_, y_: 2] := f[x, y] = {Hold[Pause[1]], x, y} ReleaseHold[f[1, 2]] // AbsoluteTiming ReleaseHold[f[1, 2]] // AbsoluteTiming ReleaseHold[f[1]] // AbsoluteTiming ReleaseHold[f[1]] // AbsoluteTiming (Debug) Out[40]= {1.000602, {Null, 1, 2}} (Debug) Out[41]= {1.000028, {Null, 1, 2}} (Debug) Out[42]= {1.000572, {Null, 1, 2}} (Debug) Out[43]= {1.000699, {Null, 1, 2}}=
- References:
- Function with optional default argument cannot cache results
- From: Dan O'Brien <danobrie@gmail.com>
- Function with optional default argument cannot cache results