Gli altri intervistati hanno risposto correttamente dicendo che hai scoperto un'espressione generatrice (che ha una notazione simile a quella delle liste di comprensione ma senza le parentesi quadre circostanti).
In generale, i genexps (come sono affettuosamente chiamati) sono più efficienti dalla memoria e più veloci delle comprensioni di elenchi.
TUTTAVIA, nel caso di ''.join()
una lista di comprensione è sia più veloce che più efficiente in termini di memoria. Il motivo è che il join deve eseguire due passaggi sui dati, quindi in realtà ha bisogno di un elenco reale. Se gliene dai uno, può iniziare immediatamente il suo lavoro. Se invece gli dai un genexp, non può iniziare a funzionare finché non costruisce un nuovo elenco in memoria eseguendo il genexp fino all'esaurimento:
~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop
Lo stesso risultato vale quando si confronta itertools.imap con map :
~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop
join
molto probabilmente sia scritto in C e quindi sia molto più veloce di una comprensione di liste ... Tempo di prova!