Другие респонденты правильно ответили, что вы обнаружили выражение-генератор (которое имеет обозначение, подобное пониманию списков, но без квадратных скобок).
В целом, genexps (так их ласково называют) более эффективны с точки зрения памяти и быстрее, чем составление списков.
ОДНАКО, в этом случае ''.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 с картой :
~ $ 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 и поэтому работает намного быстрее, чем понимание списка ... Время тестирования!