Angenommen, ich habe eine Funktion, die ein Array übernimmt und jedes Element auf 0 setzt.
%Vor%Ich möchte testen, wie lange diese Funktion benötigt, um auf einem zufälligen Array zu laufen, das ich AUSSERHALB des Zeittests erzeugen möchte. Mit anderen Worten, ich möchte nicht die Zeit angeben, die benötigt wird, um das Array in der Zeit zu erzeugen.
Ich speichere zuerst ein zufälliges Array in einer Variablen x und mache:
%Vor%Aber das gibt mir einen Fehler: NameError: globaler Name 'x' ist nicht definiert
Wie kann ich das tun?
Importieren Sie x
von __main__
ebenso :
Genau wie function
, x
ist ein Name im Modul __main__
und kann in das timeit
Setup importiert werden.
Sie können dieses Problem vollständig vermeiden, wenn Sie timeit
anstelle einer Zeichenfolge übergeben. In diesem Fall wird die Funktion in ihrer normalen Globals- und Closure-Umgebung ausgeführt. Also:
Oder, wenn Sie bevorzugen:
%Vor%(Einzelheiten hierzu finden Sie hier . Beachten Sie, dass Python 2.6+ erforderlich ist Wenn Sie 2.3-2.5 benötigen, können Sie diesen Trick nicht verwenden.)
In der Dokumentation heißt es: "Beachten Sie, dass der Timing-Overhead in diesem Fall aufgrund der zusätzlichen Funktionsaufrufe etwas größer ist."
Das bedeutet, dass timeit
selbst langsamer läuft. Zum Beispiel:
Es beeinflusst jedoch nicht die tatsächlichen Ergebnisse:
%Vor%(In den seltenen Fällen, in denen dies der Fall ist, bedeutet dies normalerweise, dass die eine oder die andere Version die Funktion nicht so testet, wie sie in Ihrem echten Code aufgerufen wird, oder die falsche Schließung oder Ähnliches getestet hat.)
Beachten Sie, dass die tatsächliche Zeit innerhalb der Funktion hier etwa 88 Sekunden beträgt, also haben wir den Overhead des Timing-Codes fast verdoppelt ... aber es sind immer noch nur 3% zur gesamten Testzeit hinzugekommen. Und je weniger trivial f
ist, desto kleiner wird dieser Unterschied sein.
Alternativ können Sie x
zu globals
hinzufügen. Das Gute daran ist, dass es in einer pdb
Debugging-Sitzung funktioniert:
Beachten Sie, dass der Timing Overhead in diesem Fall wegen der zusätzlichen Funktionsaufrufe etwas größer ist. [Quelle]
Mit Python 3.5 wurde das optionale Argument globals
eingeführt.
Es ermöglicht die Angabe des Namensraums, in dem die Zeitangabe ausgeführt werden soll.
Also, anstatt zu schreiben
%Code%,
Sie können jetzt schreiben
timeit.timeit("function(x), setup="from __main__ import function, x")
.