免責事項 (後で追加): 以下の @jasonharper および @user2357112supportsMonica のコメントを考慮してコードを変更しました。まだメモリの問題があります。
次のコードを実行しています。
import itertools
from tqdm import tnrange
import random
def perm_generator(comb1, comb2):
seen = set()
length1 = len(comb1)
length2 = len(comb2)
while True:
perm1 = tuple(random.sample(comb1, length1))
perm2 = tuple(random.sample(comb2, length2))
perm_pair = perm1 + perm2
if ( (perm_pair not in seen) ):
seen.add(perm_pair)
yield [perm1,perm2]
seq_all = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V')
combinations_first_half = list(itertools.combinations(seq_all, int(len(seq_all)/2)))
n = 1000
random.seed(0)
all_rand_permutations = []
for i in tnrange(len(combinations_first_half), desc = 'rand_permutations'):
comb1 = combinations_first_half[i]
comb2 = tuple(set(seq_all) - set(comb1))
gen = perm_generator(comb1,comb2)
rand_permutations = [next(gen) for _ in range(n)]
all_rand_permutations += rand_permutations
for ループのほとんどすべての反復で、1 秒あたり約 33 回の反復ですべてがスムーズに進みます。
ただし、まれに、ループがスタックして、かなりの数秒間メモリ不足が発生し始めることがあります。最終的に、特定の後の反復でカーネルが停止します。
random.sample()
カーネルが停止する反復またはメモリ負荷の高い反復の 1 つに関連するインデックスからループを開始した場合 (したがって、何らかの形で結果的に をシフトするrandom.seed()
)、問題はなく、ループが通過するため、関連しているようです。他の高速反復と同様です。
ここにいくつかのスクリーンショットを添付します。