Sagen wir, ich versuche, die Ausführungszeit einer Sortierfunktion zu messen, hier ist mein Code:Python Zeit: Wie initialisiert man vor jeder Wiederholung Argumente für die zeitgesteuerte Funktion?
import timeit
def time_algo(sort_fun, input_seq, num=100):
'''
Time how long it takes to sort sequence 'input_seq' using
function 'sort_fun'. Take min of 'num' times.
'''
foo = list(input_seq)
wrapped = wrapper(sort_fun, foo)
return min(timeit.repeat(wrapped, repeat=num, number=1))
def wrapper(func, *args):
def wrapped():
return func(*args)
return wrapped
print time_algo(list.sort, [10,9,8,7,6,5,4,3,2,1], num = 100)
Das Problem ist, dass nach der ersten Ausführung von sort_fun
wird die Eingangsliste bereits sortiert, und es ist läuft auf einer sortierten Liste für den Rest von num - 1
mal.
Wie kann ich die Argumente für die Eingabefunktion initialisieren (in diesem Fall execute foo = list(input_seq)
) vor jeder Wiederholung der Funktion Timing? Oder was wäre der richtige Weg, dies mit dem timeit
Modul zu tun (Ich brauche genaue Ergebnisse, damit ich keine anderen Zeitmessmethoden wie time.clock()
usw. verwenden möchte)?
Stört es Sie, wenn die Zeit für eine Kopie im Timing-Ergebnis enthalten ist? – MSeifert
Genau das versuche ich hier zu vermeiden :) –
Das wird schwer. Sie möchten, dass Ihre zu testende Funktion ihre Argumente nicht ändert. Oder Sie müssen für jeden Anruf eine Kopie erstellen. Aber solange die Funktion nicht viel Zeit benötigt, kann man (oder die timeit-Implementierung) das Timing nicht bei jedem Aufruf starten und stoppen, es ist zu kurz, das ist der Punkt von 'num> 1'. – Pierce