2011-06-28 16 views
5

En primer lugar, me gustaría mencionar que tengo un 3 gb ram.Prevenir el error de memoria en itertools.permutation

estoy trabajando en un algoritmo que es exponencial en el tiempo en los nodos de modo de que tengo en el código

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

que genera todas las combinaciones de los vértices en una lista y luego puedo trabajar en una de la permutación

Sin embargo, cuando ejecuto el programa para 40 vértices, se produce un error de memoria.

¿Hay alguna manera más simple en la implementación a través de la cual puedo generar todas las combinaciones de los vértices y no tener este error?

+3

Como barra lateral, el motivo del error de memoria es este: http://www.wolframalpha.com/input/?i=40%21+bytes+in+gigabyte – Robin

+6

'perm' contendría 815915283247897734345611269596115894272000000000 (40!) Listas de 40 artículos. –

+1

¿Te das cuenta de cuántas combinaciones de vértices hay? ¿Qué vas a hacer con todas las combinaciones? Puede evitar almacenarlos todos a la vez, pero si realmente necesita considerar cada combinación, no se garantiza que el universo exista para el momento en que termine ... cambiar a C tampoco ayudará. –

Respuesta

16

intenta utilizar el iterador generada por las permutaciones en lugar de volver a crear una lista con ella:

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

for item in perm_iterator: 
    do_the_stuff(item) 

al hacer esto, pitón guardará en la memoria solamente la permutación se utiliza actualmente, no todas las permutaciones (en términos del uso de la memoria, es realmente mejor;))

Por otro lado, una vez que el problema de memoria resuelto, el tiempo para el tratamiento de todas las permutaciones estará creciendo exponencialmente con el número de vértices ....

Cuestiones relacionadas