問題
我生成這種形式的所有可能的序列,對於一個給定的整數n:如何在python中生成大量序列時優化存儲大小和性能?
- 的序列具有長度
n
- 序列必須包含數字
n
,n-1
,n-2
,...
,n-k ≥ 1
一些k < n
。數字可以重複。
例如,對於n = 3
,可能的序列是:
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
換句話說,該序列必須包含n
和數字而沒有任何跳躍從n
遞減計數,但不以任何特定的順序,並與重複允許。
鑑於n
,這些序列的數量由ordered Bell numbers或Fubini數字給出,其增長非常快。
這裏是我使用生成的序列代碼:
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]
問題
上述作品張貼預期的代碼。我的兩個主要問題是以下幾點:
存儲:對於我的具體應用,一旦
n
選擇,我需要存儲的所有序列。我最終需要通過列表並刪除不滿足特定條件的序列。但是,即使對於小的n
(即n > 8
),也需要很多內存(GB的順序)。世代時間:我的代碼需要很長時間才能生成序列,即使對於小型的
n
。
如何以優化存儲和生成時間的方式生成序列?
當然,最好的選擇是隻生成滿足條件的序列,而不是生成稍後將被丟棄的序列。你能告訴我們情況是什麼嗎? – m69
你看過itertools嗎? https://docs.python.org/3/library/itertools.html –
@ m69:條件未知,因爲它基於後來的觀測 –