2016-06-28 46 views
1

Ich mache gerade einige Profiling-Aufgaben in Python mit cProfile (unter anderem). Im documentation heißt es:Warum werden deterministische Profiler 'deterministisch' genannt?

cProfile und Profil

Während Profilierung determinis Profilierung von Python-Programmen bieten, ich erhalte immer leicht unterschiedliche Ergebnisse mit cProfile für das gesamte Programm sowie für einzelne Funktionen. Und das ist in Ordnung, ich denke, ich verstehe zumindest einige der Gründe dafür - zum Beispiel könnten einige OS-Aufgaben im Hintergrund laufen und mein Programm verlangsamen. cProfile arbeitet schließlich in Echtzeit und nicht in CPU-Zeit.

Aber dennoch stellt sich die Frage: Warum heißt es deterministisches Profiling, wenn nicht jedes Mal die gleichen Ergebnisse erzielt werden?

+0

[Scrollen Sie nach unten in der Dokumentation.] (Https://docs.python.org/2/library/profile.html#what-is-deterministic-profiling) – Pointy

+0

Es ist ein 10-Dollar-Wort für einen 10-Cent Konzept. Es basiert auf der leeren Annahme, dass Messen hilft, * mögliche * Beschleunigungen zu finden, was nicht der Fall ist. Von da an ist es nur ein dummer Schritt, Ihr Ziel zu vergessen und sich stattdessen auf * Genauigkeit * der Messung zu konzentrieren. Viele hartnäckige Programmierer auf dieser Seite kennen den Unterschied. [* Hier sind einige der nussigen Ideen, die herum schweben, und was tatsächlich funktioniert. *] (Http://stackoverflow.com/a/1779343/23771) –

+0

10-Dollar vs 10-Cent :) Ich werde Ihre lesen Post, es scheint auf den ersten Blick faszinierend. –

Antwort

0

Die Frage ist in der documentation beantwortet:

27.4.5. Was ist deterministisches Profiling?

Die deterministische Profilerstellung soll die Tatsache widerspiegeln, dass alle Funktionsaufruf-, Funktionsrückgabe- und Ausnahmeereignisse überwacht werden, und es werden genaue Zeitvorgaben für die Intervalle zwischen diesen Ereignissen (während welcher Zeit der Benutzercode ausgeführt wird) vorgenommen. Im Gegensatz dazu tastet statistisches Profiling (das nicht von diesem Modul durchgeführt wird) zufällig den effektiven Befehlszeiger ab und leitet daraus ab, wo Zeit verbraucht wird. Die letztere Technik erfordert herkömmlicherweise weniger Overhead (da der Code nicht instrumentiert werden muss), liefert jedoch nur relative Hinweise darauf, wo Zeit verbraucht wird.

Da in Python während der Ausführung ein Interpreter aktiv ist, ist das Vorhandensein von instrumentiertem Code für deterministische Profilerstellung nicht erforderlich. Python bietet automatisch einen Hook (optionaler Rückruf) für jedes Ereignis. Darüber hinaus neigt die interpretierte Natur von Python dazu, der Ausführung so viel Overhead hinzuzufügen, dass deterministisches Profiling dazu neigt, in typischen Anwendungen nur einen geringen Verarbeitungsaufwand hinzuzufügen. Das Ergebnis ist, dass das deterministische Profiling nicht so teuer ist, jedoch umfangreiche Laufzeitstatistiken über die Ausführung eines Python-Programms bietet.

Mit Hilfe der Anrufstatistik können Fehler im Code (überraschende Anzahl) identifiziert und mögliche Inline-Erweiterungspunkte (hohe Anzahl an Anrufen) identifiziert werden. Interne Zeitstatistiken können verwendet werden, um "heiße Schleifen" zu identifizieren, die sorgfältig optimiert werden sollten. Kumulative Zeitstatistiken sollten verwendet werden, um Fehler auf hoher Ebene bei der Auswahl von Algorithmen zu identifizieren. Beachten Sie, dass die ungewöhnliche Behandlung kumulativer Zeiten in diesem Profiler Statistiken für rekursive Implementierungen von Algorithmen ermöglicht, die direkt mit iterativen Implementierungen verglichen werden.

Das bedeutet, dass es nicht von einigen Stichproben abhängig ist und unter identischen Bedingungen die Daten reproduzieren sollte.

+0

Ah, also wird der Begriff "deterministisch" nur verwendet, um ihn von statistischen Profilern zu unterscheiden?Ich denke, es ist nur ein semantisches Problem, aber die Tatsache, dass ein 'deterministischer' Profiler unterschiedliche Ergebnisse für die gleichen Eingaben liefern kann, reibt mich nur in die falsche Richtung. Es würde mehr Sinn ergeben, wenn cProfile tatsächlich die CPU-Zeit statt der Echtzeit misst. Naja ..... aber danke für die Antwort trotzdem! –