Was ist% timeit in Python?

92

Ich habe den Code immer gelesen, um die Zeit folgendermaßen zu berechnen:

%timeit function()

Können Sie erklären, was hier "%" bedeutet?

Ich denke, das "%" wird immer verwendet, um etwas in einer Zeichenfolge zu ersetzen, wie% s bedeutet, dass eine Zeichenfolge ersetzt wird,% d, um Daten zu ersetzen, aber ich habe keine Ahnung von diesem Fall.

Xirururu
quelle
15
Das ist ein magischer Befehl von iPython. Siehe: iPython Magics
MrAlexBailey

Antworten:

87

%timeitist eine ipython-Zauberfunktion , mit der ein bestimmter Code zeitlich festgelegt werden kann (eine einzelne Ausführungsanweisung oder eine einzelne Methode).

Aus den Dokumenten:

% timeit

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Um es zu verwenden, zum Beispiel, wenn wir herausfinden möchten, ob die Verwendung xrangeschneller ist als die Verwendung range, können Sie einfach Folgendes tun:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

Und Sie werden die Timings für sie bekommen.

Der Hauptvorteil von %timeitsind:

  • Sie müssen nicht timeit.timeit aus der Standardbibliothek importieren und den Code mehrmals ausführen, um herauszufinden, welcher Ansatz der bessere ist.

  • % timeit berechnet automatisch die Anzahl der für Ihren Code erforderlichen Läufe basierend auf einem Ausführungsfenster von insgesamt 2 Sekunden.

  • Sie können auch aktuelle Konsolenvariablen verwenden, ohne das gesamte Code-Snippet timeit.timeitzu übergeben, um die Variable zu erstellen, die in einer anderen Umgebung erstellt wurde, in der timeit funktioniert.

mu 無
quelle
1
Gibt es eine Möglichkeit, ein Makro oder eine Reihe von Zeilen aus der Ipython-Shell zu messen?
Alpha_989
2
@ alpha_989 Ja, Sie können diese Zeilen in eine Funktion einschließen und dann die Funktion wie folgt zeitlich festlegen:%timeit function()
mu
@mu 無: Bitte klären Sie timer.timeit- ist das ein tatsächlicher Modulname ?
Brunnenkopf
2
@ Brunnenkopf: docs.python.org/3/library/timeit.html#timeit.timeit
Sasha Chedygov
Die Ausgabe 10000 loops, best of 3: 29.6 µs per loopkann wie folgt interpretiert werden: (1.) Der Ausdruck wird 10000 Mal ausgeführt, um die Gesamtzeit zu erhalten. (2.) Dann wird die Gesamtzeit durch 10000 geteilt, um die Zeit "pro Schleife" zu erhalten. (3.) Die Gesamtzeitberechnung wird durchgeführt 3 Mal und schließlich (4.) der 3 Gesamtzeiten wird die minimale Gesamtzeit (auch als "Best of 3" bezeichnet) als Ausgabe verwendet. Ist meine Interpretation richtig, ja / nein?
Trevor Boyd Smith
36

Dies wird als eine bekannte Linie Magie in ipython. Sie sind insofern einzigartig, als ihre Argumente nur bis zum Ende der aktuellen Zeile reichen und die Magie selbst für die Befehlszeilenentwicklung wirklich strukturiert ist. timeitwird verwendet, um die Ausführung von Code zeitlich zu steuern.

Wenn Sie alle Magie sehen möchten, die Sie verwenden können, können Sie einfach Folgendes eingeben:

%lsmagic

um eine Liste sowohl der Linienmagie als auch der Zellmagie zu erhalten.

Einige weitere magische Informationen aus der Dokumentation hier :

IPython hat ein Befehlssystem, das wir Magie nennen Befehlssystem, das das effektiv eine Mini-Befehlssprache bereitstellt, die orthogonal zur Syntax von Python ist und vom Benutzer mit neuen Befehlen erweitert werden kann. Magics sollen interaktiv eingegeben werden, daher verwenden sie Befehlszeilenkonventionen, z. B. Leerzeichen zum Trennen von Argumenten, Bindestriche für Optionen und andere für eine Befehlszeilenumgebung typische Konventionen.

Je nachdem , ob Sie in Zeile oder Zelle - Modus gibt es zwei verschiedene Arten zu verwenden %timeit. Ihre Frage zeigt den ersten Weg:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :
Miradulo
quelle
2

Ich möchte nur einen weiteren nützlichen Vorteil der Verwendung von% timeit hinzufügen, um mit mu 無 zu antworten :

  • Sie können auch aktuelle Konsolenvariablen verwenden, ohne das gesamte Codefragment zu übergeben, wie im Fall von timeit.timeit, um die Variable zu erstellen, die in einer anderen Umgebung erstellt wurde, in der timeit funktioniert.

PS: Ich weiß, dass dies ein Kommentar sein sollte, um oben zu antworten, aber ich habe derzeit nicht genug Ruf dafür. Ich hoffe, dass das, was ich schreibe, für jemanden hilfreich ist und mir hilft, genug Ruf zu verdienen, um es beim nächsten Mal zu kommentieren.

Ankit Agrawal
quelle
1
Sie können auch die Antwort einer anderen Person bearbeiten, um sie zu verbessern. Sie sollten schon genug Ruf dafür haben
Tarick Welling
Danke wusste das nicht. @ TarWWelling
Ankit Agrawal
1

Ich wollte nur einen sehr subtilen Punkt über %% timeit hinzufügen. Wenn die "Magie" in der Zelle ausgeführt wird , wird eine Fehlermeldung angezeigt ...

UsageError: Line Magic-Funktion %%timeitnicht gefunden

... wenn es Code- / Kommentarzeilen über %% timeit gibt. Mit anderen Worten, stellen Sie sicher, dass %% timeit der erste Befehl in Ihrer Zelle ist.

Ich weiß, dass es ein kleiner Punkt ist, zu dem alle Experten duh sagen werden, aber ich wollte nur meinen halben Cent für die jungen Zauberer hinzufügen, die mit Zaubertricks beginnen.

erfolgreichmike
quelle
1
Dies gilt nicht für die iPython-Shell, sondern nur für ein Jupyter-Notebook
snakecharmerb
0

Der Zeilenmagie wird das Zeichen % vorangestellt und funktioniert ähnlich wie bei Befehlszeilenaufrufen des Betriebssystems: Sie erhalten als Argument den Rest der Zeile, in der Argumente ohne Klammern oder Anführungszeichen übergeben werden. Der Zellmagie wird ein doppeltes %% vorangestellt , und es handelt sich um Funktionen, die als Argument nicht nur den Rest der Zeile, sondern auch die Zeilen darunter in einem separaten Argument erhalten.

Mohammad Salehi
quelle