Pozostali respondenci mieli rację, odpowiadając, że znalazłeś wyrażenie generatora (które ma notację podobną do wyrażeń listowych, ale bez otaczających nawiasów kwadratowych).
Ogólnie rzecz biorąc, geneksy (jak są czule znane) są bardziej wydajne w pamięci i szybsze niż rozumienia list.
JEDNAK w przypadku ''.join()
, rozumienie listy jest zarówno szybsze, jak i bardziej wydajne w pamięci. Powodem jest to, że złączenie musi wykonać dwa przejścia przez dane, więc w rzeczywistości potrzebuje prawdziwej listy. Jeśli go podasz, może natychmiast rozpocząć pracę. Jeśli zamiast tego podasz mu genexp, nie będzie mógł rozpocząć pracy, dopóki nie utworzy nowej listy w pamięci, uruchamiając genexp do wyczerpania:
~ $ 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
Ten sam wynik zachodzi przy porównaniu itertools.imap z 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
najprawdopodobniej jest napisane w C i dlatego działa znacznie szybciej niż zrozumienie listy ... Czas testu!