1

假设我有两个非常大的字典: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)

因此,如果 THRESHOLD 为 0.3,则将 freezeset("a1","b2","c3") 添加到 setOfMatches,但如果 THRESHOLD 为 0.7,则不会添加。

我意识到这效率不高,但我绝对愿意接受任何建议,包括将关键数据类型转换为其他数据类型以加快速度。我也研究过使用 Numba 和 Cython 等工具(不过我更喜欢将它保存在纯 python 中)。它需要快速疯狂!

非常感谢任何帮助!谢谢!

4

1 回答 1

2
  1. 您没有使用 and 的值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
于 2018-07-19T02:19:23.453 回答