[Python] media di un generatore
Dario Bertini
berdario a gmail.com
Mer 11 Dic 2013 02:42:37 CET
2013/12/10 Piergiuliano Bossi <pgbossi at gmail.com>:
>>>> def avg(gen):
> ... x = itertools.izip(*((i, 1) for i in gen))
> ... return float(sum(x.next())) / sum(x.next())
> ...
Capisco l'attrattiva del problema, ma questo non fa assolutamente
quello che vuoi, a causa dell'unpacking degli argomenti di izip
per dimostrarlo (python3):
>>> print(*((i,1) for i in [1,2,3]))
(1, 1) (2, 1) (3, 1)
come vedi, non ti stampa dei generator (non avrebbe senso)... ha già
tutti i valori belli che allocati in memoria
per averne conferma, prova ad eseguire
sum(next(zip(*((i,1) for i in range(10000000)))))
ma tieni pronto il ^C :P
sum(range(10000000))
sum di per se invece è in grado di lavorare tranquillamente sui
generatori senza fare allocazioni superflue
qualcosa di interessante per te magari può essere calcolare tutte le
medie intermedie (media mobile?)
from itertools import accumulate, islice
>>> def avgs(gen):
for count, partial_sum in enumerate(accumulate(gen), 1):
yield partial_sum / count
>>> next(islice(avgs(range(10000000)), 9999999, None))
4999999.5
>>> list(avgs([5,2,8]))
[5.0, 3.5, 5.0]
--
xmpp: berdario at gmail.com
bitmessage: BM-2cTYXfGiSTsnx3righ6aHcJSWe4MV17jDP
gpg fingerprint: 3F8D53518012716C4EEF7DF67B498306B3BF75A0 (used just
for signing commits)
Maggiori informazioni sulla lista
Python