Python如何高效实现嵌套循环生成Wordle模式嵌套字典?
问题背景
我有两个5字符单词列表:allwords(约12000个元素)、possible_wordse(约2000个元素),需要生成嵌套字典{allwords词: {possible_wordse词: Wordle反馈模式}},模式是猜测词对应答案的Wordle结果(如"10102")。当前用字典推导式+wordas2函数处理重复字母规则,耗时约70秒,想通过numpy、pandas或Python内置方法优化,或确认实现思路是否有问题。环境为Python3.10.5、numpy1.21.5、pandas1.4.2,最终目的是计算猜测词的熵/期望信息增益。
优化方案
一、先优化核心匹配逻辑(内置方法)
当前wordas2函数的调用开销是核心瓶颈——12000×2000=2400万次函数调用,哪怕每次多几微秒都会累计成可观耗时。用内置collections.Counter重构匹配逻辑,减少函数调用并提升效率:
from collections import Counter def get_wordle_pattern(guess, answer): pattern = ['0'] * 5 answer_counts = Counter(answer) # 先标记全匹配(2)的位置 for i in range(5): if guess[i] == answer[i]: pattern[i] = '2' answer_counts[guess[i]] -= 1 # 再标记半匹配(1)的位置 for i in range(5): if pattern[i] == '0' and answer_counts.get(guess[i], 0) > 0: pattern[i] = '1' answer_counts[guess[i]] -= 1 return ''.join(pattern)
Counter是C实现的内置工具,比自定义统计逻辑快得多,同时把逻辑inline到推导式中,可进一步减少函数调用开销。
二、numpy矢量化批量处理
利用numpy的C层循环替代Python循环,提升批量处理效率:
- 将两个单词列表转为形状为
(12000,5)和(2000,5)的numpy字符数组; - 计算全匹配布尔矩阵:
full_match = guess_arr[:, None, :] == answer_arr[None, :, :],得到(12000,2000,5)的匹配结果; - 用
np.unique统计每个答案的字母频率,广播处理剩余字母的半匹配逻辑,最后将匹配结果拼接为字符串模式。
注:numpy处理字符串需注意版本兼容性,建议升级到numpy1.24+,其字符串操作性能有明显提升。
三、pandas批量操作优化
将单词转为DataFrame后用矢量化操作替代逐行循环:
- 把
allwords和possible_wordse分别转为5列的DataFrame,每列对应单词的一个字符; - 通过广播计算所有猜测-答案对的字母匹配情况,先处理全匹配再处理半匹配;
- 直接将每行匹配结果拼接为字符串,后续计算熵时可直接用DataGroupBy统计模式分布,无需生成嵌套字典。
四、重构实现思路:预缓存模式计数
最终目的是计算熵,无需生成完整嵌套字典——对每个猜测词,直接统计{模式: 对应答案数量}的映射即可。这样内存占用从2400万条记录降到12000个小型字典(每个最多243种模式,5位×3种结果),计算速度也会大幅提升,因为无需存储重复的模式-答案映射。
五、多核并行加速
用multiprocessing将allwords拆分为多个批次,利用多核CPU并行计算每个批次的模式映射,可进一步压缩耗时。
内容的提问来源于stack exchange,提问作者Isak Vormeland

