使用Python,在返回匹配超过某个阈值的键(作为冻结集)时,比较两个大字典的最快方法是什么?

2024-09-26 22:12:44 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个非常大的字典:bigDictA和bigDictB,如下所示。你知道吗

bigDictA = {frozenset("a1","b2","c3"): [some floats in a list], ...}
bigDictB = {frozenset("a1","b2"): [some floats in a list], ...}

现在,我写的算法,我需要帮助优化如下:

setOfMatches = set()
for bigDictAkey, bigDictAval in bigDictA.items():
    for bigDictBkey, bigDictBval in bigDictB.items():
        itemsInCommon = list(frozenset.intersection(bigDictAkey,bigDictBkey))
        numberOfItemsInCommon = len(itemsInCommon)
        valForComparison = THRESHOLD*float(len(list(bigDictAkey)))
        if (numberOfItemsInCommon >= valForComparison):
            setOfMatches.add(bigDictAkey)

所以,如果阈值为0.3,冻结集(“a1”,“b2”,“c3”)将添加到匹配集,但如果阈值为0.7,则不会添加。你知道吗

我意识到这样做效率不高,但我绝对愿意接受任何建议,包括将密钥数据类型转换为其他数据类型以提高速度。我还研究了使用诸如Numba和Cython之类的工具(尽管我更喜欢用纯python)。快疯了!你知道吗

非常感谢您的帮助!谢谢!你知道吗


Tags: infora1itemssomeb2listc3
1条回答
网友
1楼 · 发布于 2024-09-26 22:12:44
  1. 您没有使用bigDictAbigDictB的值,因此不需要使用dict.items()方法。你知道吗
  2. len()也适用于集合,因此无需将集合转换为列表以获得其大小。你知道吗
  3. 一旦有一个匹配项高于阈值,并且您将bigDictAkey添加到setOfMatches,就不需要测试bigDictB中的其余项,您应该立即break内部循环以检查bigDictA中的下一项。你知道吗

改进后的代码如下:

setOfMatches = set()
for bigDictAkey in bigDictA:
    for bigDictBkey in bigDictB:
        numberOfItemsInCommon = len(bigDictAkey & bigDictBkey)
        valForComparison = THRESHOLD*len(bigDictAkey)
        if (numberOfItemsInCommon >= valForComparison):
            setOfMatches.add(bigDictAkey)
            break

相关问题 更多 >

    热门问题