MathGroup Archive 2009

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

Search the Archive

Re: SetDelayed and Evaluate

  • To: mathgroup at
  • Subject: [mg104509] Re: SetDelayed and Evaluate
  • From: David Bailey <dave at>
  • Date: Sun, 1 Nov 2009 17:59:17 -0500 (EST)
  • References: <hcjiul$jmr$>

Peter wrote:
> Hi group,
> after years of experience with Mathematica I've got a simple (?)
> problem:
> When answering to a question on the student support forum (http://
> I tried fo myself
> the folowing variants:
> f[z_?NumericQ]:=Compile[{{x,_Real}},x-x^2][z];
> g[z_?NumericQ]:=Evaluate[Compile[{{x,_Real}},x-x^2]][z];
> and got the following results:
> In[6]:= Timing[Do[NMaximize[f[x],x],{1000}]]
> Out[6]= {35.871,Null}
> In[7]:= Timing[Do[NMaximize[g[x],x],{1000}]]
> Out[7]= {35.962,Null}
> ~1 ms per NMaximize is OK, because there are background-processes
> running.
> But I expect f to compile x-x^2 at every call to f and g to compile
> once on time of definition. Therefore I expected g to be significantly
> faster than f.
> Where am I wrong?
> TIA,
> Peter Pein
If you evaluate ?g you can see that the Evaluate has not done what you 
expected. The reason is that Evaluate would need to apply to the whole 
second argument of SetDelayed. Calls to Evaluate nested inside 
expressions that are not themselves evaluated, do not work:




Therefore either use


or, if you want to keep the ?NumericQ qualification

With[{cc = Compile[{{x, _Real}}, x - x^2]}, g[z_?NumericQ] := cc[z]]

I would be inclined to use a more complicated function to ensure that 
the timing is not swamped by the function startup code, and/or the 
actual NMinimize code. Also, tor timing purposes, I always loop over a 
calculation to get a time of at least several seconds, otherwise the 
time is rather unreliable.

David Bailey

  • Prev by Date: Re: SetDelayed and Evaluate
  • Next by Date: Re: dynamicmodule with f[x_] possible?
  • Previous by thread: Re: SetDelayed and Evaluate
  • Next by thread: Re: SetDelayed and Evaluate