2017-02-03 8 views
0

У меня есть сценарий следующим образом:Слишком большой itertools.product в Python

set=[0,1] 
sub=prod(set,repeat=10) 
subset = [item for item in sub] 

Там, подмножество содержит 10 элементов множества комбинаций.

Когда я меняю повтор с 10 на 500, невозможно увидеть подмножество! Как я могу справиться с этой проблемой?

Я думаю, это будет RAM-захватчик!

+0

Это было бы из длина '2^500' байт. Рам 8GB составляет '2^30' байт. – Uriel

+0

@UrielEli: '2^500' элементы, добавьте еще несколько бит, если вы подсчитываете байты. :-) – ShadowRanger

+0

@ShadowRanger правый. Исходя из 'sys.getsizeoff', который будет около' 2^511'. – Uriel

ответ

3

Это не подмножество, которое вы создаете, это всего лишь list всех значений из product. Спросить всех из них одновременно эквивалентно запуску счетчика от 0 до 2 ** 500, что, если это неясно, приведет к грубой «жаркой смерти вселенной» даже на низкоуровневых, близких к металлическим языкам. Написано, у вас будет 3273390607896141870013189696827599152216482046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376 различные выходы.

Вы не можете реализовать все значения, период, не говоря уже о всех сразу. Если вы хотите увидеть некоторые из них, вы можете итерируете product и печати, как вы идете:

valset = [0, 1] # Don't name a variable set, it shadows the built-in set 

for subset in prod(valset, repeat=10): 
    print(subset) # Be prepared to Ctrl-C this, it will never end on its own 

или использовать itertools.islice стащить управляемый номер для list римента:

first10000subsets = list(itertools.islice(prod(valset, repeat=10), 10000)) 
+0

ShadowRanger спасибо. Я должен изучить все элементы в 2 ** 500. Но делать это быстро и быстрее. –

+0

@ YasinKÜTÜK: Нет, нет. Если вы считаете, что это так, это потому, что у вас есть [проблема XY] (http://meta.stackexchange.com/q/66377/322040), и вы убедились в том, что нет лучшего способа ее решения. Я * гарантирую * вы, либо есть лучший способ решить вашу проблему, * или * ваша проблема не может быть решена, период. Самый быстрый компьютер в мире не может * подсчитывать * один за другим до '2 ** 500', не говоря уже о генерации многих программных' tuple'. Это не может быть сделано. Итак, выясните, какова ваша настоящая проблема, и найдите лучший способ ее решить. – ShadowRanger

+0

Какой замечательный ответ! Я понял, что ты абсолютно прав. Я просто столкнулся с проблемой XY. что я ничего не знаю об этом. Итак, я думаю о прямом решении. Я должен найти новые решения для своей проблемы, чтобы справиться с этим. –