list(itertools.combinations(range(5), 2))
возвращает список из 10 позиций, где две могут быть в пределах пяти цифр (остальные равны нулю):
[(0, 1),
(0, 2),
(0, 3),
(0, 4),
(1, 2),
(1, 3),
(1, 4),
(2, 3),
(2, 4),
(3, 4)]
Для вашего случая с 2 единицами и 13 нулями используйте это:
list(itertools.combinations(range(5), 2))
, который возвращает список из 105 позиций. И это намного быстрее, чем ваше оригинальное решение.
Теперь функция:
def combiner(zeros=3, ones=2):
for indices in itertools.combinations(range(zeros+ones), ones):
item = ['0'] * (zeros+ones)
for index in indices:
item[index] = '1'
yield ''.join(item)
print list(combiner(3, 2))
['11000',
'01100',
'01010',
'01001',
'00101',
'00110',
'10001',
'10010',
'00011',
'10100']
и для этого нужно 14,4 мкс.
list(combiner(13, 2))
для возврата 105 элементов требуется 134 мкс.