Speeding up code
- To: mathgroup at smc.vnet.net
 - Subject: [mg100392] Speeding up code
 - From: borisov at sas.upenn.edu
 - Date: Tue, 2 Jun 2009 06:46:51 -0400 (EDT)
 
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}];
   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}];
   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];
    ];
   (* 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}],
        Table[{nvar*i, nvar*(i - 1) + 2} -> ElemEIEI[[i]], {i,
          ngrid - 1}],
        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