Los otros encuestados tenían razón al responder que había descubierto una expresión generadora (que tiene una notación similar a las listas por comprensión, pero sin los corchetes que la rodean).
En general, los genexps (como se les conoce cariñosamente) son más eficientes en memoria y más rápidos que las listas por comprensión.
SIN EMBARGO, en el caso de ''.join()
, la comprensión de una lista es más rápida y más eficiente en la memoria. La razón es que join necesita realizar dos pasadas sobre los datos, por lo que en realidad necesita una lista real. Si le da uno, puede comenzar a trabajar de inmediato. Si le da un genexp en su lugar, no puede comenzar a funcionar hasta que construya una nueva lista en la memoria ejecutando genexp hasta el agotamiento:
~ $ 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
El mismo resultado es válido al comparar itertools.imap versus 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
probablemente esté escrito en C y, por lo tanto, se ejecute mucho más rápido que la comprensión de una lista ... ¡Tiempo de prueba!