Другие респонденты были правы, когда ответили, что вы обнаружили выражение генератора (которое имеет обозначение, похожее на понимание списка, но без окружающих квадратных скобок).
В общем, 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 против карта :
~ $ 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