Ich habe ein Python-Skript, das genau so funktioniert, wie es sollte, aber ich muss die Ausführungszeit schreiben. Ich habe gegoogelt, dass ich es verwenden sollte, timeit
aber ich kann es scheinbar nicht zum Laufen bringen.
Mein Python-Skript sieht folgendermaßen aus:
import sys
import getopt
import timeit
import random
import os
import re
import ibm_db
import time
from string import maketrans
myfile = open("results_update.txt", "a")
for r in range(100):
rannumber = random.randint(0, 100)
update = "update TABLE set val = %i where MyCount >= '2010' and MyCount < '2012' and number = '250'" % rannumber
#print rannumber
conn = ibm_db.pconnect("dsn=myDB","usrname","secretPWD")
for r in range(5):
print "Run %s\n" % r
ibm_db.execute(query_stmt)
query_stmt = ibm_db.prepare(conn, update)
myfile.close()
ibm_db.close(conn)
Was ich brauche, ist die Zeit, die benötigt wird, um die Abfrage auszuführen und in die Datei zu schreiben results_update.txt
. Der Zweck besteht darin, eine Aktualisierungsanweisung für meine Datenbank mit verschiedenen Indizes und Optimierungsmechanismen zu testen.
python
testing
timeit
database-tuning
Mestika
quelle
quelle
timeit
? Ich denke nicht. In diesem Fall sollten Sie wahrscheinlich "with Pythons timeit" aus dem Titel entfernen.Antworten:
Sie können
time.time()
odertime.clock()
vor und nach dem Block verwenden, den Sie zeitlich festlegen möchten.Diese Methode ist nicht so genau wie
timeit
(es werden nicht mehrere Läufe gemittelt), aber sie ist unkompliziert.time.time()
(unter Windows und Linux) undtime.clock()
(unter Linux) sind für schnelle Funktionen nicht präzise genug (Sie erhalten total = 0). In diesem Fall oder wenn Sie die Zeit abgelaufen ist nach mehreren Durchläufen mitteln wollen, müssen Sie manuell die Funktion mehrmals aufrufen (wie ich denke , schon in Ihnen Beispielcode Sie tun und timeit tut automatisch , wenn Sie seine Set - Nummer Argument)In Windows hat, wie Corey im Kommentar angegeben hat,
time.clock()
eine viel höhere Genauigkeit (Mikrosekunde statt Sekunde) und wird gegenüber bevorzugttime.time()
.quelle
timeit.default_timer
; Python hat die Arbeit bereits für Sie erledigt. Aber wirklich, Sie solltentimeit.timeit(myfast, number=n)
das sich wiederholende Aufrufrad verwenden, anstatt es neu zu erfinden (und die Tatsache übersehen, dasstimeit
der Garbage Collector deaktiviert wird, während der Code wiederholt ausgeführt wird).Wenn Sie Ihren Code profilieren und IPython verwenden können, hat er die magische Funktion
%timeit
.%%timeit
arbeitet auf Zellen.quelle
Abgesehen vom Timing ist dieser Code, den Sie anzeigen, einfach falsch: Sie führen 100 Verbindungen aus (wobei alle bis auf die letzte vollständig ignoriert werden), und wenn Sie den ersten Ausführungsaufruf ausführen, übergeben Sie ihm eine lokale Variable,
query_stmt
die Sie erst nach der Ausführung initialisieren Anruf.Stellen Sie zunächst Ihren Code korrekt ein, ohne sich noch Gedanken über das Timing zu machen: dh eine Funktion, die eine Verbindung herstellt oder empfängt und 100 oder 500 oder eine beliebige Anzahl von Aktualisierungen für diese Verbindung ausführt, schließt dann die Verbindung. Sobald Sie Ihren Code richtig funktionieren lassen, ist der richtige Punkt, an dem Sie darüber nachdenken sollten,
timeit
ihn zu verwenden!Insbesondere wenn die Funktion, die
foobar
Sie zeitlich festlegen möchten, eine parameterlose Funktion ist, die aufgerufen wird , können Sie timeit.timeit verwenden (2.6 oder höher - es ist in 2.5 und früher komplizierter):Sie sollten die Anzahl der Läufe besser angeben, da der Standardwert von einer Million für Ihren Anwendungsfall möglicherweise hoch ist (was dazu führt, dass Sie viel Zeit in diesem Code verbringen ;-).
quelle
foobar
in einer Hauptdatei befindet. So:timeit.timeit('foobar()','from __main__ import foobar',number=1000)
timeit.timeit( foobar, number=1000 )
Konzentrieren Sie sich auf eine bestimmte Sache . Die Festplatten-E / A ist langsam, daher würde ich das aus dem Test herausnehmen, wenn Sie nur die Datenbankabfrage optimieren möchten.
Wenn Sie die Ausführung Ihrer Datenbank zeitlich festlegen müssen, suchen Sie stattdessen nach Datenbanktools, z. B. nach dem Abfrageplan, und beachten Sie, dass die Leistung nicht nur von der genauen Abfrage und den vorhandenen Indizes abhängt, sondern auch von der Datenlast (wie viele Daten) Sie gespeichert haben).
Das heißt, Sie können einfach Ihren Code in eine Funktion einfügen und diese Funktion ausführen mit
timeit.timeit()
:Dies würde die Speicherbereinigung deaktivieren, die
function_to_repeat()
Funktion wiederholt aufrufen und die Gesamtdauer dieser Aufrufe zeitlich festlegen. Diestimeit.default_timer()
ist die genaueste verfügbare Uhr für Ihre spezifische Plattform.Sie sollten den Setup-Code aus der wiederholten Funktion entfernen . Sie sollten beispielsweise zuerst eine Verbindung zur Datenbank herstellen und dann nur die Abfragen zeitlich festlegen. Verwenden Sie die
setup
Argument, um diese Abhängigkeiten entweder zu importieren oder zu erstellen, und übergeben Sie sie an Ihre Funktion:würde die Globals greifen
function_to_repeat
,var1
undvar2
von Ihrem Skript und diejenigen , an die Funktion jeder Wiederholung passieren.quelle
eval
ing nicht für etwas fliegen wird, das nicht ganz trivial ist. thxIch sehe, dass die Frage bereits beantwortet wurde, möchte aber trotzdem meine 2 Cent dafür hinzufügen.
Ich habe auch ein ähnliches Szenario erlebt, in dem ich die Ausführungszeiten für verschiedene Ansätze testen und daher ein kleines Skript schreiben muss, das die Zeit für alle darin geschriebenen Funktionen aufruft.
Das Skript ist auch als Github Kern verfügbar hier .
Hoffe es wird dir und anderen helfen.
quelle
Hier ist eine einfache Hülle für die Antwort von Steven. Diese Funktion führt keine wiederholten Läufe / Mittelungen durch, erspart Ihnen lediglich, den Timing-Code überall wiederholen zu müssen :)
quelle
Die Testsuite versucht nicht, das Importierte zu verwenden,
timeit
daher ist es schwer zu sagen, was die Absicht war. Trotzdem ist dies eine kanonische Antwort, so dass ein vollständiges Beispiel für angebrachttimeit
erscheint und Martijns Antwort näher erläutert wird .Die Dokumente
timeit
bieten viele Beispiele und Flags, die es wert sind, überprüft zu werden. Die grundlegende Verwendung in der Befehlszeile lautet:Führen Sie mit aus
-h
, um alle Optionen anzuzeigen. Python MOTW hat einen großartigen Abschnitt übertimeit
dem gezeigt wird, wie Module über Import- und mehrzeilige die Befehlszeile ausgeführt werden.In Skriptform verwende ich es normalerweise so:
Sie können ganz einfach die Funktionen und Argumente eingeben, die Sie benötigen. Seien Sie vorsichtig, wenn Sie unreine Funktionen verwenden, und achten Sie auf den Zustand.
Beispielausgabe:
quelle