Il giorno 20/lug/2012, alle ore 15:02, Alberto Granzotto <agran...@gmail.com> ha scritto:
> questo esempio mi ha acceso una lampadina (ammetto di non essermi mai posto > il problema), `all` e `any` cortocircuitano ma bisogna stare attenti: > > In [1]: l = range(1000) > > In [2]: timeit all([x for x in l]) > 10000 loops, best of 3: 42.6 us per loop > > In [3]: timeit all(x for x in l) > 1000000 loops, best of 3: 661 ns per loop > > oppure, per togliere ogni dubbio: > > In [7]: def foo(x): print '.',; return x > > In [8]: all([foo(x) for x in l]) > . . . . . . [tanti altri puntini] .Out[8]: False > > In [9]: all(foo(x) for x in l) > .Out[9]: False > > nel primo caso mi sa che l'interprete genera la lista che poi è passata a > `all`. Esatto. Viene generata tutta la lista. Ma comunque all non la scorre tutta: esce al primo elemento anche se la lista è comunque "piena". > Nel secondo invece è sufficientemente sveglio da fare la cosa giusta. La vedo > un po' come la differenza tra range e xrange. Nel secondo caso invece c'è di mezzo un generatore. Esattamente come con xrange :-) Ciao. Marco. _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python