使用 Python,在返回匹配超过特定阈值的键(如冻结集)时比较两个大型词典的最快方法是什么?
Using Python, what is the fastest way to compare two large dictionaries while returning keys (as frozensets) that match past a certain threshold?
假设我有两个非常大的词典: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,frozenset("a1","b2","c3") 将添加到 setOfMatches,但如果 THRESHOLD 为 0.7,则不会添加。
我意识到这效率不高,但我绝对愿意接受任何建议,包括将关键数据类型转换为其他数据类型以加快速度。我也研究过使用像 Numba 和 Cython 这样的工具(不过我更喜欢将它保持在纯 python 中)。它需要疯狂的快!
非常感谢任何帮助!谢谢!
- 您没有使用
bigDictA
和 bigDictB
的值,因此您不需要使用 dict.items()
方法。
len()
也适用于集合,因此无需将集合转换为列表来获取其大小。
- 一旦有一个匹配项超过阈值并且您将
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
假设我有两个非常大的词典: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,frozenset("a1","b2","c3") 将添加到 setOfMatches,但如果 THRESHOLD 为 0.7,则不会添加。
我意识到这效率不高,但我绝对愿意接受任何建议,包括将关键数据类型转换为其他数据类型以加快速度。我也研究过使用像 Numba 和 Cython 这样的工具(不过我更喜欢将它保持在纯 python 中)。它需要疯狂的快!
非常感谢任何帮助!谢谢!
- 您没有使用
bigDictA
和bigDictB
的值,因此您不需要使用dict.items()
方法。 len()
也适用于集合,因此无需将集合转换为列表来获取其大小。- 一旦有一个匹配项超过阈值并且您将
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