eigentlich wollte ich mir heute morgen nur schnell selbst beweisen, dass eine Liste mit datetime.date-Objekten schneller erstellt ist als dieselben Objekte über einen Generator abgerufen sind.
Dazu habe ich eine Funktion, die eine Liste per List-Comprehension übergibt, gegen eine Funktion, die dieselben Objekte als Generator bereitstellt, verglichen.
Das Ergebnis hat mich dann doch überrascht! Wider meiner Erwartung ist der Generator nach verschiedenen Durchläufen im Durchschnitt ca. 2 x schneller!?
Weil ich das so nicht glauben konnte habe ich dann noch eine weitere Funktion, die eine Liste innerhalb einer while-Schleife erstellt und übergibt, in den Vergleich einbezogen.
Dieses Ergebnis entsprach dann doch eher meinen Erwartungen: Die Funktion mit der while-Schleife ist etwas schneller als der Generator, da sie auch nicht für jedes Listenelement extra aufgerufen werden muss.
Bleibt für mich nur die Frage: Weshalb ist ein List-Comprehension dermaßen träge? Nach meinem Verstehen wird hierbei eine Liste erstellt, indem eine Schleife durchlaufen wird. Weshalb benötigt diese Schleife so viel länger als eine while-Schleife?
Hier noch der Code:
Code: Alles auswählen
import time
import datetime
def generator(count):
date = datetime.date.today()
while count:
date += datetime.timedelta(count - (count - 1))
yield date
count -= 1
def list_while(count):
date = datetime.date.today()
date_list = []
while count:
date += datetime.timedelta(count - (count - 1))
date_list.append(date)
count -= 1
return date_list
def list_comp(count):
return [datetime.date.today() + datetime.timedelta(i) \
for i in range(count)]
def start(count):
gen_time_start = time.time()
gen_list = []
gen = generator(count)
for i in range(count):
gen_list.append(gen.next())
gen_time_stop = time.time()
print('%d Daten per Generator : %f sec.' % (count,
gen_time_stop - gen_time_start))
lw_time_start = time.time()
lw_list = list_while(count)
lw_time_stop = time.time()
print('%d Daten per Schleife : %f sec.' % (count,
lw_time_stop - lw_time_start))
lc_time_start = time.time()
lc_list = list_comp(count)
lc_time_stop = time.time()
print('%d Daten per List-Comprehension: %f sec.' % (count,
lc_time_stop - lc_time_start))
Hab' mich jetzt mal wieder selbst verunsichert, wäre für Eure Ansichten sehr dankbar!
Gruß
mutetella