Re: Question on Compile[]

*To*: mathgroup at smc.vnet.net*Subject*: [mg49779] Re: [mg49747] Question on Compile[]*From*: Sseziwa Mukasa <mukasa at jeol.com>*Date*: Sat, 31 Jul 2004 03:13:59 -0400 (EDT)*References*: <200407301002.GAA26336@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

On Jul 30, 2004, at 6:02 AM, Mark Coleman wrote: > GThe > computation is quite simple, Let > > cashFlow be a list of real numbers of length n and let nvec=Range[n], > then the discounted cash flow is the sum over i=1,n of > > cashFlow(i)/(1+r)^i > > where r is a real number with 0 < r < 1. > > The final Mathematica code is: > > > Clear[dcf]; > dcf[cashFlow_, rate_] := Module[{nvec = Range[Length[cashFlow]]}, > Total[cashFlow/(1.0 + rate)^nvec] > ] > > > On my 800 Mhz Powerbook G4, 5000 trials of this takes 3.72 seconds, > while the compiled version takes 4.2 seconds. > > Any ideas how I can speed this up, to get the usual gains one typically > sees in compiled code? You can get a slight improvement by not explicitly creating a temporary variable which removes the need for the Module expression as well: dcf[cashFlow_, rate_] := Total[cashFlow/(1.0 + rate)^Range[Length[cashFlow]]] My guess is that this is the fastest possible expression. From the information in the Help Browser Compile has to do some extra checks at run time about whether a statement can be done numerically or not. The expression itself is very efficient and should result in a very small piece of machine code which operates optimally. Any extra work therefore, such as any overhead introduced by Compile will only slow it down. That's my guess anyway. Regards, Ssezi

**References**:**Question on Compile[]***From:*Mark Coleman <mark@markscoleman.com>