Pracuję zgodnie z teorią, że wyrażeń generatora wydają się być bardziej wydajne niż normalne pętle. Ale wtedy natknąłem się na następujący przykład: napisać funkcję, która podała numer, N
, a niektóre czynniki, ps
, zwraca sumę wszystkich liczb pod N
, które są wielokrotnością co najmniej jednego czynnika.Dlaczego ta funkcja wyrażeń generatora jest wolniejsza od wersji pętli?
Oto wersja pętli i krótszą wersję wyrażenie generator:
def loops(N, ps):
total_sum = 0
for i in xrange(N):
for p in ps:
if i%p == 0:
total_sum += i
break
return total_sum
def genexp(N, ps):
return sum(i for i in xrange(N)
if any(i%p == 0 for p in ps))
będę oczekiwać na dwa wykonać mniej więcej równe, z może wersji zrozumieniem trochę szybciej, ale to, co nie spodziewałem było to:
for func in ('loops', 'genexp'):
print func, timeit.timeit('%s(100000, [3,5,7])' % func,
number=100,
setup='from __main__ import %s' % func)
loops 2.82878184319
genexp 10.1663100719
4x wolniej nie jest nawet blisko! Czemu? Co ja nie rozumiem?
Masz * wyrażeń generatorowych *, a nie wyrażeń list. –
@MartijnPieters Dzięki! Najwyraźniej nie jestem facetem z Pythona :) – Barry