[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