2016-10-04 2 views
0

Я хочу, чтобы вычислить все возможные способы построения бинарного списка длиной п с помощью следующей строкипамяти ошибок питон вычислительные перестановки списка

combinations = map(list, itertools.product([0, 1], repeat=n)) 

Это прекрасно работает с низким п, но я хочу, чтобы вычислить это для большого n (т.е. значения между 25-35). Есть ли лучший и эффективный способ создания этого списка?

+0

Мне нужен список списков, и в любом случае это не работает на моем компьютере MemoryError для больших n. – Chicony

+3

Какова цель? Если вам не нужны все значения сразу, почему бы просто не сохранить итератор, а не «сопоставить» с списками? –

+0

В чем проблема? Ошибка памяти? Пожалуйста, укажите вывод ошибки – tuergeist

ответ

2

Просто создать список «ленивый», так, чтобы не хранить всю вещь в памяти сразу:

n = some-largish-value 

for i in itertools.product([0, 1], repeat=n): 
    result = do_something_with(list(i)) 
1

Вы пытаетесь найти все комбинации 0 и 1 для п термина. Общее количество таких комбинаций будет 2**n. Для n=30 общее количество таких комбинаций: 1073741824. Огромного нет?

Для того, чтобы избавиться от ошибки памяти, вы должны использовать generator, которые динамически сочетают комбинации, а не сохраняя их как список. Кроме того, поскольку это комбинация только 0s и 1s. Почему бы не печатать двоичные числа от 0 до '1'*n?

Ниже итератор для достижения этой цели, как:

def binary_combinations(num): 
    my_binary_string = '1'*num 
    my_int_num = int(my_binary_string, 2) 
    format_string = '{'+':0{}b'.format(num)+'}' 
    for i in xrange(my_int_num): 
     yield format_string.format(i) 
    else: 
     raise StopIteration('End of Memory Issue!') 

Чтобы выполнить это, сделайте следующее:

>>> for i in binary_combinations(3): 
...  print i 
... 
000 
001 
010 
011 
100 
101 
110 

Здесь n = 3. Теперь вы можете использовать его с n = 30, 40, .. или любым, что вы хотите;)

0

Нет, если вы действительно хотите список списков, то ваш код почти так же эффективен как память. Ваша проблема - это размер списка, а не то, как вы его вычисляете.

Вы понимаете, что для n = 35 у вас будет 1 202 590 842 880 элементов? Большинство (если не все) настольных компьютеров не могут содержать так много целых чисел python в памяти.

Смежные вопросы