[Python] media di un generatore

Marco Chieppa | crap0101 crap0101 a riseup.net
Mer 11 Dic 2013 02:40:25 CET


Il giorno Tue, 10 Dec 2013 18:58:48 -0500
Piergiuliano Bossi <pgbossi a gmail.com> ha scritto:

> On Tuesday, December 10, 2013, Marco Beri wrote:
> [...]
> >
> > def avg(gen):
> >     n, sum_ = 0, 0.0
> >     for v in gen:
> >         sum_ += v
> >         n += 1
> >     return sum_ / n
> >
> > Cos'ha questo di brutto? Tra l'altro funziona anche con le liste e le
> > tuple..
> >
> >
> >
> Nulla, ma è il modo più idiomatico di farlo? Fate tutti così? Dai
> confessa... :)
> 

non molto diverso in realtà... ma potresti usare enumerate:

def avg(seq):
    tot = 0.0
    for n, v in enumerate(seq, 1):
        tot += v
    try:
        return tot / n
    except UnboundLocalError:
        return 0 # ???

capisco che il try/except finale non è molto bello, ma forse lo dovrai/vorrai
utilizzare anche con altri metodi, nel caso in cui passi una sequenza che non
contiene alcun elemento (ad esempio nell'altro codice sopra avresti un
ZeroDivisionError).
 
Non ho capito bene quando parli di

> la creazione di 2 iteratori in itertools.izip(*generator)

non mi pare faccia quello che ti serve, forse intendevi itertools.tee ?
Quest'ultimo potrebbe essere una soluzione però non credo valga la pena di
creare dei doppioni (soprattutto con sequenze lunghe) quando puoi fare con un
unico for...

def avgtee(seq):
    it1, it2 = itertools.tee(seq)
    try:
        return sum(it1) / float(sum(1 for _ in it2))
    except ZeroDivisionError:
        return 0 # ???

non ho fatto test particolarmente approfonditi, btw qualche risultato:

In [22]: lst = list(range(100000))

In [23]: %timeit avg(lst)
100 loops, best of 3: 12.2 ms per loop

In [24]: %timeit avgtee(lst)
100 loops, best of 3: 9.27 ms per loop

In [25]: gen = (x for x in lst)

In [26]: %timeit avg(gen)
100000 loops, best of 3: 2.07 us per loop

In [27]: gen = (x for x in lst)

In [28]: %timeit avgtee(gen)
100000 loops, best of 3: 3.57 us per loop






-- 
me -> http://crap0101.gnu-darwin.org/
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        signature.asc
Tipo:        application/pgp-signature
Dimensione:  836 bytes
Descrizione: non disponibile
URL:         <http://lists.python.it/pipermail/python/attachments/20131211/24ca4c8e/attachment.pgp>


Maggiori informazioni sulla lista Python