Інші респонденти правильно відповіли, що ви виявили генераторний вираз (який має позначення, схожі на розуміння списку, але без оточуючих квадратних дужок).
Загалом, genexps (як їх ласкаво знають) ефективніші та швидші за пам'ять, ніж розуміння списків.
Втім, як би там не було ''.join()
, розуміння списку є швидшим та ефективнішим. Причина полягає в тому, що join повинен зробити два переходи до даних, тому йому насправді потрібен реальний список. Якщо ви дасте його, він може негайно розпочати свою роботу. Якщо ви надаєте йому genexp, він не може розпочати роботу, поки не створить новий список у пам'яті, запустивши genexp до вичерпання:
~ $ 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
Той самий результат має місце при порівнянні itertools.imap та 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
це, швидше за все, написано на мові C і тому працює набагато швидше, ніж розуміння списку ... Час тестування!