Ваше решение уже выглядит довольно неплохо, но вот несколько вариантов для полноты:
''.join(map(random.choice, [E]*N))
Или с itertools:
from itertools import repeat
''.join(map(random.choice, repeat(E, N)))
Если вы используете Python 2.x, itertools.imap()
будет более эффективным, чем map()
, поскольку он не создаст полный список в памяти.
Вот некоторые интересные временные данные (проверено на Python 2.6):
>>> import timeit
>>> t1 = timeit.Timer("''.join(random.choice('abcdefghijkl') for i in xrange(3))", "import random")
>>> t2 = timeit.Timer("''.join(map(random.choice, ['abcdefghijkl']*3))", "import random")
>>> t3 = timeit.Timer("''.join(map(random.choice, repeat('abcdefghijkl', 3)))", "import random; from itertools import repeat")
>>> t4 = timeit.Timer("''.join(random.sample('abcdefghijkl'*3, 3))", "import random")
>>> t1.timeit(1000000) # (random.choice(E) for i in xrange(N)) - OP
7.0744400024414062
>>> t2.timeit(1000000) # map(random.choice, [E]*N) - F.J
4.3570120334625244
>>> t3.timeit(1000000) # map(random.choice, repeat(E, N)) - F.J
5.9411048889160156
>>> t4.timeit(1000000) # random.sample(E*N, N) - DSM
6.9877378940582275
Очевидно, map(random.choice, [E]*N)
является победителем, по крайней мере, для маленьких E
и N
.