2011-06-28 7 views
5

Po pierwsze chciałbym wspomnieć, że mam 3 tryby pamięci RAM.Zapobieganie błędom pamięci w itertools.permutation

Pracuję nad algorytmu, który jest wykładniczy w czasie na węzłach tak dla niej mam w kodzie

perm = list(itertools.permutations(list(graph.Nodes))) # graph.Nodes is a tuple of 1 , 2 , ... n integers 

który generuje wszystkie kombinacje wierzchołki na liście, a następnie mogę pracować na jednym permutacji.

Jednak po uruchomieniu programu dla 40 wierzchołków powoduje błąd pamięci.

Czy istnieje prostszy sposób realizacji, za pomocą którego mogę wygenerować wszystkie kombinacje wierzchołków i nie mam tego błędu.

+3

Jako pasek boczny przyczyną błędu pamięci jest: http://www.wolframalpha.com/input/?i=40%21+bytes+w+gigabicie – Robin

+6

'perm' zawiera 815915283247897734345611269596115894272000000000 (40!) List 40 pozycji. –

+1

Czy wiesz, ile jest możliwych kombinacji wierzchołków? Co zamierzasz zrobić ze wszystkimi kombinacjami? Możesz uniknąć przechowywania wszystkich naraz, ale jeśli naprawdę musisz wziąć pod uwagę każdą kombinację, Wszechświat nie ma gwarancji, że do czasu, gdy skończysz, nie będzie istniało ... Przełączenie się na C też nie pomoże. –

Odpowiedz

16

spróbuje użyć iteracyjnej generowane przez permutacji zamiast odtworzyć listę z nim:

perm_iterator = itertools.permutations(list(graph.Nodes)) 

for item in perm_iterator: 
    do_the_stuff(item) 

robiąc to, pyton zachowa w pamięci tylko aktualnie używanego permutacji nie wszystkie permutacje (w perspektywie wykorzystania pamięci, to jest naprawdę lepiej;))

z drugiej strony, gdy rozwiązano problem pamięci, czas traktować wszystkie permutacje będzie rosła wykładniczo wraz z liczbą wierzchołków ....

Powiązane problemy