problème
Je générant toutes les séquences possibles de cette forme, pour un entier n suivant:Comment optimiser la taille et la performance du stockage lors de la génération d'une grande liste de séquences en python?
- la séquence a une longueur
n
- la séquence doit contenir les numéros
n
,n-1
,n-2
,...
,n-k ≥ 1
pour certainsk < n
. Les chiffres peuvent être répétés.
Par exemple, pour n = 3
, les séquences possibles sont:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
2, 2, 3
2, 3, 2
3, 2, 2
2, 3, 3
3, 2, 3
3, 3, 2
3, 3, 3
En d'autres termes, la séquence doit contenir n
et le nombre décompter de n
sans sauts, mais sans ordre particulier et répétitions autorisées.
Étant donné n
, le nombre de ces séquences est donné par les nombres ordered Bell numbers ou Fubini, qui se développent extrêmement rapidement.
Voici le code que j'utilise pour générer les séquences:
from sympy.utilities.iterables import multiset_permutations
def generate_sequences(n):
sequences = []
for unpermuted_seq in unpermuted_sequences(n,n):
for permutation in multiset_permutations(unpermuted_seq):
sequences.append(permutation)
return sequences
def unpermuted_sequences(number,remaining_slots):
# Generates list of possible unpermuted sequences
if remaining_slots == 0:
yield []
return
for repetitions in range(1, remaining_slots + 1):
for sequence in unpermuted_sequences(number - 1, remaining_slots - repetitions):
yield sequence + repetitions*[number]
Questions
Le code affiché ci-dessus fonctionne comme prévu. Mes deux principales préoccupations sont les suivantes:
Stockage: Pour ma application particulière, une fois
n
est choisi, je dois stocker toutes les séquences. Je finirai par devoir parcourir la liste et supprimer les séquences qui ne satisfont pas à une condition particulière. Cependant, même pour un petitn
(c'est-à-diren > 8
), beaucoup de mémoire est nécessaire (ordre des Go).Temps de génération: Mon code prend beaucoup de temps à générer les séquences, même pour les petites
n
.
Comment puis-je générer les séquences de manière à optimiser le temps de stockage et de génération?
La meilleure option est bien entendu de générer uniquement les séquences qui satisfont la condition, au lieu de générer des séquences que vous rejetterez plus tard. Pouvez-vous nous dire quelle est la situation? – m69
avez-vous regardé itertools? https://docs.python.org/3/library/itertools.html –
@ m69: la condition n'est pas connue à l'avance car elle est basée sur des observations ultérieures –