Re: Speeding up code
- To: mathgroup at smc.vnet.net
- Subject: [mg100432] Re: Speeding up code
- From: dh <dh at metrohm.com>
- Date: Wed, 3 Jun 2009 05:28:26 -0400 (EDT)
- References: <h02vo6$8ek$1@smc.vnet.net>
Hi Alexander, see below, Daniel borisov at sas.upenn.edu wrote: > Hello all, > > > I need some advise on speeding up code. Here is a section that is executed more > than 100000 times during my simulations. Currently it takes about 0.06s per > execution which is about 80% of the total time for the simulation. The > subsection MITime itself takes 0.03s out of those 0.06s. All variables not > defined in this section are predefined. Anyone have suggestions? > > MDTime = First[ > Timing[ > yps = Table[(ys[[i]] + ys[[i - 1]])/2, {i, 2, ngrid}]; this can be written: yps= Differences[ys]/2 > yms = Table[(ys[[i]] - ys[[i - 1]]), {i, 2, ngrid}]; > ups = Table[(us[[i]] + us[[i - 1]])/2, {i, 2, ngrid}]; > ums = Table[(us[[i]] - us[[i - 1]]), {i, 2, ngrid}]; > Etus = Table[rrms[[i]]*Exp[-ups[[i]]], {i, 1, ngrid - 1}]; > (*Etu2s=Table[Exp[-ups[[i]]/2],{i,1,ngrid-1}];*) > > SqEts = Table[ > rrpms[[i]]*sqrrs[[i]]*Exp[-ups[[i]]/2]*acubed*rba, {i, 1, > ngrid - 1}]; this can be written: SqEts= rrpms sqrrs Exp[-ups/2] acubed rba > ElemEIEI = Table[N[SqEts[[i]]/4, Precis], {i, ngrid - 1}]; > ElemOIOI = Table[N[-Etus[[i]]/2, Precis], {i, ngrid - 1}]; > ElemOIOI1 = > Table[N[yps[[i]]*Etus[[i]]/2, Precis], {i, ngrid - 1}]; > Es[[ngrid*nvar]] = N[Exp[us[[ngrid]]] - rrs[[ngrid]], Precis]; > Es[[1]] = Exp[us[[1]]] - rrs[[1]]*ys[[1]]; > For[i = 1, i <= ngrid - 1, i++, > Es[[nvar*i]] = N[yms[[i]] + Yds[[i]] - SqEts[[i]], Precis]; > Es[[nvar*i + 1]] = N[ums[[i]] - yps[[i]]*Etus[[i]], Precis]; > ]; the loop can be written: Es[[nvar Range[ngrid-1]]]= N[yms + Yds - SqEts, Precis] Es[[nvar Range[ngrid-1]+1]]= N[ums - yps Etus, Precis] > (* Table of rules used to create the Sms matrix*) > > MITime = First[ > Timing[ > DataSAP = Join[ > Table[{nvar*i, nvar*(i - 1) + 1} -> N[-1., Precis], {i, > ngrid - 1}], this can be written: Thread[Transpose[{nvar*Range[ngrid-1], nvar*(Range[ngrid-1] - 1) + 1}] -> N[-1., Precis]] > Table[{nvar*i, nvar*(i - 1) + 2} -> ElemEIEI[[i]], {i, > ngrid - 1}], this can be written: Thread[Transpose[{nvar*Range[ngrid-1], nvar*(Range[ngrid-1] - 1) + 1}] -> ElemEIEI] > Table[{nvar*i, nvar*(i - 1) + 3} -> N[1., Precis], {i, > ngrid - 1}], > Table[{nvar*i, nvar*(i - 1) + 4} -> ElemEIEI[[i]], {i, > ngrid - 1}], > Table[{nvar*i + 1, nvar*(i - 1) + 1} -> ElemOIOI[[i]], {i, > ngrid - 1}], > Table[{nvar*i + 1, nvar*(i - 1) + 2} -> > ElemOIOI1[[i]] - 1., {i, ngrid - 1}], > Table[{nvar*i + 1, nvar*(i - 1) + 3} -> ElemOIOI[[i]], {i, > ngrid - 1}], > Table[{nvar*i + 1, nvar*(i - 1) + 4} -> > ElemOIOI1[[i]] + 1., {i, ngrid - 1}]] > ] > ]; > DataSA = Prepend[DataSAP, {1, 2} -> N[Exp[us[[1]]], Precis]]; > DataSA = > Prepend[DataSA, {nvg, nvg} -> N[Exp[us[[ngrid]]], Precis]]; > DataSA = Prepend[DataSA, {1, 1} -> N[-rrs[[1]], Precis]]; > Sms = SparseArray[DataSA]; > ] > ]; > > > > Best regards > Alexander >