Python中n个含m元素列表的高效随机抽样问题求助
高效随机抽样多列表组合的解决方案
你现在的代码靠递归生成所有组合再抽样,面对100亿级别的总组合数完全行不通。既然只需要抽最多1000条唯一组合,直接生成随机组合并去重就是最优方案——毕竟总组合数远大于抽样量,重复概率低到可以忽略,根本不用担心性能问题。
核心思路
- 给每个变量随机挑一个可选值,拼成一条组合
- 用集合存已经生成的组合(集合天然去重),直到凑够1000条
- 最后把集合转成DataFrame导出到Excel
优化后的代码
import pandas as pd import random # 读取原始数据 df = pd.read_excel('Variables.xlsx', sheet_name="Variables", index_col=0) target_count = 1000 # 预处理:把每个变量的可选值整理成列表(去掉空值) variable_options = [col.dropna().tolist() for _, col in df.iterrows()] # 生成唯一的随机组合 unique_combinations = set() while len(unique_combinations) < target_count: # 逐个变量随机选值,转成元组(元组可哈希,能放进集合) combo = tuple(random.choice(opts) for opts in variable_options) unique_combinations.add(combo) # 转换成DataFrame df_out = pd.DataFrame(unique_combinations, columns=df.index) # 导出到Excel的指定工作表 with pd.ExcelWriter("Variables.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as writer: df_out.to_excel(writer, 'Simulations', index=False)
为什么这方法高效?
- 内存省:不用生成100亿条组合占内存,最多存1000条,内存压力几乎为0
- 速度快:每次生成一条组合只需要遍历32个变量做随机选择,循环个1000次左右就搞定,毫秒级跑完
- 灵活度高:要是以后抽样量接近总组合数,再加个判断逻辑,当剩下要抽的数量小于总组合数减去已生成数时,直接生成剩余未出现的组合就行——不过你现在的场景完全用不上这步
内容的提问来源于stack exchange,提问作者Bastian Borum Andersen
相关产品推荐
相关产品推荐

