Python:从指定数字区间生成唯一有序列表的最快实现方法
生成百万级唯一有序列表的最优解决方案
原有代码运行极慢的核心原因有两个:
- 用列表做存在性检查,
r not in mainlist的时间复杂度是O(n),当mainlist长度到百万级时,单次检查就要遍历上百万个元素,总时间复杂度达到O(n²),完全无法支撑576万的量级 - 列表是不可哈希类型,无法存入哈希结构做O(1)的存在性校验
以下是两类可直接落地的最优方案,可按需选择:
方案1:需要列表随机分布的场景
从1-10000中取24个不重复元素的有序排列总共有 P(10000,24) 种,这个数值远大于576万,随机采样的碰撞概率几乎可以忽略,仅需要把查重结构换成哈希集合即可大幅提升效率:
import random num_pool = list(range(1, 10001)) seen = set() mainlist = [] target_count = 5760000 while len(mainlist) < target_count: cur_sample = random.sample(num_pool, 24) # 转成可哈希的元组存入集合做O(1)查重 cur_tuple = tuple(cur_sample) if cur_tuple not in seen: seen.add(cur_tuple) mainlist.append(cur_sample)
该方案在普通消费级CPU上运行时间一般在30秒到2分钟之间,可正常跑完生成任务。
方案2:无随机分布要求,仅需满足规则的场景
如果对列表的随机分布没有要求,可以直接按规则生成唯一列表,不需要任何查重逻辑,几秒就能生成全部数据:
mainlist = [] target_count = 5760000 for offset in range(target_count): # 滑动窗口生成24个连续不重复的数,天然有序且所有列表互不重复 cur_sample = [(offset + i) % 10000 + 1 for i in range(24)] mainlist.append(cur_sample)
该方案生成的所有列表天然满足:内部无重复元素、任意两个列表不完全相同、顺序可区分的要求。
内容的提问来源于stack exchange,提问作者West
相关产品推荐
相关产品推荐

