Re: How to avoid repeated recalculation of the same function
- To: mathgroup at smc.vnet.net
- Subject: [mg132673] Re: How to avoid repeated recalculation of the same function
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sat, 3 May 2014 03:39:54 -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
On 5/2/14 at 2:18 AM, pgeipi10 at gmail.com wrote:
>I'm doing a calculaton that's purly symbolic (no graphing, numerical
>integration, etc.).
>Suppose I have a function f[x_]:=... that's very complex to build.
>In fact, f[x] ends up being a manageable expression (about 30
>characters) but it takes Mathematica about 30 min to build that
>expression.
>Another function g[] uses the function f[x] and references it many
>times. I've discovered that g[] actually builds f[x] every time it's
>referenced which takes 30 minutes each time. Theoretically,
>Mathematica could build it once and then use the resulting
>expression every time it's referenced.
>So how do I accomplish that? That is, how do I make it build f[x]
>once and then use the resulting expression when it's needed?
Use Set rather than SetDelayed in the definition of f[x]. For
example, consider
In[1]:= f[x_] := Integrate[2 z + 3, {z, 0, x}];
g[x_] = Integrate[2 z + 3, {z, 0, x}];
Both accomplish the same thing as verified by
In[3]:= f[y] === g[y]
Out[3]= True
But notice the difference below
In[4]:= DownValues[g]
Out[4]= {HoldPattern[g[x_]] :> x^2 + 3*x}
In[5]:= DownValues[f]
Out[5]= {HoldPattern[f[x_]] :> Integrate[2*z + 3, {z, 0, x}]}
The integration step is done once with g but repeated every f is
called. And you can clearly see the difference this makes by
plotting both, i.e.,
In[6]:= Timing[Plot[f[x], {x, 0, 2}];]
Out[6]= {4.232786,Null}
In[7]:= Timing[Plot[g[x], {x, 0, 2}];]
Out[7]= {0.004068,Null}