Ho operato secondo la teoria che le espressioni del generatore tendono ad essere più efficienti dei normali cicli. Ma poi mi sono imbattuto nel seguente esempio: scrivere una funzione che ha dato un numero, N
, e alcuni fattori, ps
, restituisce la somma di tutti i numeri sotto N
che sono un multiplo di almeno un fattore.Perché questa funzione di espressione del generatore è più lenta della versione del loop?
Ecco una versione ad anello e una più breve versione generatore di espressione:
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))
mi aspetto i due per eseguire o meno uguali, con forse la versione di comprensione un po 'più veloce, ma quello che non si aspettava era questo:
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 più lento non è nemmeno vicino! Perché? Che cosa sto fraintendendo?
Hai * espressioni generatore *, non list comprehensions. –
@MartijnPieters Grazie! Chiaramente non sono un tipo pitone :) – Barry