2016-07-28 25 views
-1

Ich habe den folgenden Code, für 1 Kombination (Kamm) dauert es 2 Minuten zu laufen. Ich muss es auf 20.000 Kombinationen ausführen. df_ncol = 200 und nrow = 10000. Irgendeine Idee, wie man die Laufzeit verbessert?Verbesserung der Laufzeit von Schleifen

Für jede Kombination Ich tue das folgende:

die Werte der Spalte J in eine neue Spalte kopieren, die den gleichen Namen und einen Wert an den Namen angehängt nehmen. Dann führe ich eine Transformation für diese neue Spalte in allen Zeilen durch (manchmal bin ich der Loop-Exit vorher, siehe den IF-Teil im Code). Sobald die Transformation abgeschlossen ist, gehe ich in die nächste Spalte und mache dasselbe. Sobald die Tabelle mit der doppelten Anzahl von Spalten gefüllt ist, gibt es einen anderen Teil, der nicht in dem Code enthalten ist, der nur eine Summierung von dieser finalen Tabelle speichert, diese Summierung läuft ziemlich schnell ab. Danach gehe ich zur nächsten Kombination und erstelle eine weitere Tabelle und so weiter, bis ich den letzten Kombinationswert erreiche. Der Flaschenhals passiert in der Transformationsphase, wenn ich in den Reihen renne. Ich bin ziemlich neu in R und ich glaube, ich vermisse das Wissen darüber, wie ich mich in dieser Phase verbessern kann.

system.time({ 
    for(f in 1:Comb){ 

     for(j in names(dfnew1)[4:df_ncol]){ 
      ar<-final[f,j] 
      dfnew1[[paste(j, 'a', ar,sep="_")]]<-dfnew1[[j]] 

      last=ind[[j]] 
      index_num=index[j]+1 

      for(i in index_num:nrow_){ 
       dfnew1[[paste(j, 'a',ar, sep="_")]][i] <- dfnew1[[j]][i]+ ar * dfnew1[[paste(j,'a',ar,sep="_")]][i-1] 
       if (i>last & (dfnew1[[paste(j, 'a',ar, sep="_")]][i]<(0.05*dfnew1[[j]][last]))){i=nrow_} 
      } 
     } 
    } 
}) 
+0

Sie haben keine Daten eingegeben, daher können wir Ihren Code nicht ausführen oder testen. Stellen Sie sicher, dass Sie ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) enthalten, wenn Sie eine Frage stellen. Besser noch zu beschreiben, was Sie vorhaben, anstatt uns nur zu zeigen, wie Sie sich entschieden haben. – MrFlick

+0

Sie haben eine ziemlich große Datentabelle, die konstante Schleife und das Hinzufügen zusätzlicher Spalten zu einem vorhandenen Datenrahmen ist langsam. Sie finden es möglicherweise schneller, eine sekundäre Tabelle mit der richtigen Größe zuzuordnen und dann die Spalten bei der Berechnung zu aktualisieren. – Dave2e

Antwort

0

Sie könnten Ihren Code in Rprof() wickeln:

Rprof("myloop") 

## YOUR CODE HERE 

Rprof(NULL) # cancel 
summaryRprof("myloop")$by.self 

und herauszufinden, was genau die meiste Zeit nimmt.

+0

Danke, ich werde es versuchen. – user4797853

+0

Ich habe diese Ausgabe erhalten, ich bin mir nicht sicher, wo das Problem liegt, indem ich [[? self.time self.pct total.time gesamt.pct "einfügen" 14.44 17.28 14.44 17.28 "[[<-. data.frame" 8.68 10.39 16.66 19.93 "[[.data.frame" 5.10 6.10 37.42 44.77 " [[“4.84 5.79 42.26 50.56 "" 4.60 5.50 22.66 27.11 "% in%" 2.28 2.73 11.20 13.40 "[[<-" 1.36 1.63 18.02 21.56 – user4797853

+0

Neuere Versionen von RStudio haben eingebaute Profilierwerkzeuge. https://support.rstudio.com/hc/en-us/articles/218221837-Profiling-with-RStudio –