Ich würde sehr gerne einen Line Profiler verwenden. Dieser existiert in Matlab und Python und ist sehr nützlich, um Codeteile zu finden, die viel Zeit benötigen oder mehr (oder weniger) als erwartet ausgeführt werden. Ein großer Teil meines Codes beinhaltet Funktionsoptimierungen, und wie oft etwas iteriert wird, ist möglicherweise nicht im Voraus bekannt (obwohl die meisten Iterationen eingeschränkt oder festgelegt sind).
Der Aufrufstapel ist nützlich, wenn Ihr gesamter Code in R vorliegt und sehr einfach ist, aber als Ich habe kürzlich darüber geschrieben Wenn Ihr Code komplex ist, ist das eine mühsame Arbeit.
Es ist recht einfach, einen Zeilen-Profiler für einen bestimmten Teil des Codes zu entwickeln. Ein naiver Weg ist es, jede Zeile (oder nur vorher festgelegte Abschnitte) zu indizieren und einen Aufruf von log einzufügen proc.time()
diese Zeile. In einer Schleife zähle ich einfach Codeabschnitte auf und speichere in einer zweidimensionalen Liste die proc.time
Werte für Abschnitt i
nach und nach k
. (Siehe Update unten: dies ist nicht wirklich eine Möglichkeit, einen Line Profiler für alle Arten von Code zu erstellen).
Mit einem solchen Tool kann man Hotspots, Anomalien (z. B. Code, der eigentlich O(n) sein sollte, aber in Wirklichkeit O(n^2) ist), Code, der von einer Memoisierung profitieren könnte (ein Line Profiler sagt Ihnen das nicht, aber er lässt Sie wissen, wo Sie suchen müssen), Code, der sich fälschlicherweise innerhalb einer Schleife befindet, und vieles mehr finden.
Aktualisierung 1: Die Einfügung einer Timing-Zeile zwischen jeder Funktionszeile ist ein kleiner Fehler: Die Definition einer Codezeile ist nicht einfach durch Leerzeichen getrennter Code. Um zu wissen, wo Operationen beginnen und enden, muss man in der Lage sein, den Code in einen AST zu zerlegen. Wie in einigen der Antworten auf diese Frage gibt es einige Werkzeuge (namentlich, showTree
y walkCode
im codetools
Paket) für diese Aufgabe. Einfach einen regulären Ausdruck auf den Quellcode anzuwenden, wäre eine sehr schlechte Idee.