2017-02-03 1 views
0

j'ai un script comme suit:Trop grand itertools.product en Python

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

là, sous-ensemble contient 10 éléments de combinaisons de jeu.

Quand je change répéter de 10 à 500, il est impossible de voir le sous-ensemble! Comment puis-je gérer ce problème? Je suppose que cela devient RAM envahisseur!

+0

Ce serait de longueur '2^500' octets. Ram de 8 Go est '2^30' octets. – Uriel

+0

@UrielEli: éléments '2^500', ajoutez quelques bits supplémentaires si vous comptez des octets. :-) – ShadowRanger

+0

@ShadowRanger à droite. En partant de 'sys.getsizeoff' qui serait autour de' 2^511'. – Uriel

Répondre

3

Ce n'est pas un sous-ensemble que vous faites, c'est juste de faire un list de toutes les valeurs du product. Demander à chacun d'eux à la fois équivaut à courir un compteur de 0 à 2 ** 500, ce qui, en cas de doute, prendrait à peu près le temps de "chaleur mort de l'univers" même à bas niveau, proche des langages métalliques. Ecrit, vous auriez 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376 différentes sorties.

Vous ne pouvez pas réaliser toutes les valeurs, période, et encore moins tout à la fois. Si vous voulez voir certains d'entre eux, vous pouvez itérer le product et imprimer comme vous allez:

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 

ou utiliser itertools.islice pour retirer un nombre gérable à list ifier:

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

ShadowRanger merci. Je dois examiner tous les éléments dans 2 ** 500. Mais il n'y a aucun moyen de le faire rapidement et plus rapidement. –

+0

@ YasinKÜTÜK: Non, vous ne le faites pas. Si vous pensez que c'est le cas, c'est parce que vous avez [un problème XY] (http://meta.stackexchange.com/q/66377/322040), et vous vous êtes convaincu qu'il n'y a pas de meilleure façon de le résoudre. Je * vous garantis, soit il y a une meilleure façon de résoudre votre problème, * ou * votre problème ne peut être résolu, point. L'ordinateur le plus rapide au monde ne peut * compter * un par un à "2 ** 500", et encore moins générer autant de "tuple". Cela * ne peut pas * être fait. Alors, déterminez quel est votre véritable problème et trouvez une meilleure façon de le résoudre. – ShadowRanger

+0

Quelle bonne réponse! J'ai réalisé que tu as absolument raison. Je viens de faire face à un problème XY. ce que je ne sais rien à ce sujet. Donc, je pense à la solution directe. Je dois trouver de nouvelles solutions à mon problème pour y faire face. –