Python: Gibt es eine Möglichkeit, eine Variable mit timeit.timeit () zu importieren?

8

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?

    
Martijn Pieters 18.09.2013, 21:34
quelle

5 Antworten

18

Importieren Sie x von __main__ ebenso :

%Vor%

Genau wie function , x ist ein Name im Modul __main__ und kann in das timeit Setup importiert werden.

    
Martijn Pieters 18.09.2013 21:36
quelle
11

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:

%Vor%

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:

%Vor%

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.

    
abarnert 18.09.2013 21:38
quelle
3

Import x von __main__ :

%Vor%     
Andrew Clark 18.09.2013 21:36
quelle
0

Alternativ können Sie x zu globals hinzufügen. Das Gute daran ist, dass es in einer pdb Debugging-Sitzung funktioniert:

%Vor%
  

Beachten Sie, dass der Timing Overhead in diesem Fall wegen der zusätzlichen Funktionsaufrufe etwas größer ist. [Quelle]

    
Dennis Golomazov 09.02.2017 02:20
quelle
0

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") .

    
Darkonaut 01.01.2018 20:33
quelle

Tags und Links