You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何高效实现嵌套循环生成Wordle模式嵌套字典?

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循环,提升批量处理效率:

  1. 将两个单词列表转为形状为(12000,5)和(2000,5)的numpy字符数组;
  2. 计算全匹配布尔矩阵:full_match = guess_arr[:, None, :] == answer_arr[None, :, :],得到(12000,2000,5)的匹配结果;
  3. 用np.unique统计每个答案的字母频率,广播处理剩余字母的半匹配逻辑,最后将匹配结果拼接为字符串模式。

注:numpy处理字符串需注意版本兼容性,建议升级到numpy1.24+,其字符串操作性能有明显提升。

三、pandas批量操作优化

将单词转为DataFrame后用矢量化操作替代逐行循环:

  1. 把allwords和possible_wordse分别转为5列的DataFrame,每列对应单词的一个字符;
  2. 通过广播计算所有猜测-答案对的字母匹配情况,先处理全匹配再处理半匹配;
  3. 直接将每行匹配结果拼接为字符串,后续计算熵时可直接用DataGroupBy统计模式分布,无需生成嵌套字典。

四、重构实现思路:预缓存模式计数

最终目的是计算熵,无需生成完整嵌套字典——对每个猜测词,直接统计{模式: 对应答案数量}的映射即可。这样内存占用从2400万条记录降到12000个小型字典(每个最多243种模式,5位×3种结果),计算速度也会大幅提升,因为无需存储重复的模式-答案映射。

五、多核并行加速

用multiprocessing将allwords拆分为多个批次,利用多核CPU并行计算每个批次的模式映射,可进一步压缩耗时。


内容的提问来源于stack exchange,提问作者Isak Vormeland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:36:19