如何在不生成全排列的情况下随机采样排列以避免内存错误?
无需存储全排列的随机排列采样方案
你之前的思路核心问题在于:不管是把itertools.permutations转成列表还是直接用迭代器采样,本质都要生成所有排列——而40的阶乘是个天文数字(约8e47),根本不可能放进内存。正确的思路是直接生成独立的随机排列,完全不用碰全排列集合。
下面是两种可行的实现方案:
方案一:用Python标准库实现
直接用random.sample()生成单个随机排列,因为从长度为n的序列中无重复抽取n个元素,结果就是一个随机排列。循环m次就能得到m个样本:
import random import numpy as np n = 40 # 待排列的字符数量 m = 1000 # 需要采样的样本数 seq_to_permute = np.arange(1, n+1).tolist() # 转换为list适配random.sample perm_samples = [] for _ in range(m): # 每次生成一个独立的随机排列 random_perm = random.sample(seq_to_permute, n) perm_samples.append(random_perm)
方案二:用Numpy高效实现
如果需要处理大量样本,Numpy的向量化操作效率更高,用np.random.permutation()直接打乱序列生成排列:
import numpy as np n = 40 m = 1000 seq_to_permute = np.arange(1, n+1) # 生成m个随机排列,每行对应一个样本 perm_samples = np.array([np.random.permutation(seq_to_permute) for _ in range(m)]) # 更高效的向量化写法(避免显式循环) # perm_samples = np.random.permutation(np.tile(seq_to_permute, (m, 1)))
关键说明
这两种方法的核心是:每个随机排列都是独立生成的,和从全排列集合中随机抽取的统计特性完全一致,但完全不需要存储任何全排列数据,内存占用仅取决于样本数量m,n=40、m=1000的场景下完全不会触发内存错误。
内容的提问来源于stack exchange,提问作者elfe
相关产品推荐
相关产品推荐

