[英]python huge dictionary comparison
我有两个字典和一个列表如下
list1 =[['3', {'3': ['4'], '10': ['2'], '9': ['8'], '11': ['8']}],
['8', {'7': ['8'], '6': ['9'], '3': ['1']}],
['7', {'5': ['11'], '10': ['6'], '2': ['3']}],
['9', {'4': ['1']}]
]
list2 ={0: -2.829363315837061, 1: -3.483150971596311, 2: -3.55866903680906, 3: -3.644673448138691, 4: -3.78, 5: -3.9343704669124677, 6: -4.1158785480167435, 7: -4.074895059134982, 8: -4.397225116848732, 9: -4.425674125747298, 10: -4.416164011466592, 11: -4.906491662382141}
list3 ={0: -2.865996006819783, 1: -3.6503055799900492, 2: -3.58670223884185, 3: -3.73129019873609, 4: -3.73, 5: -4.049442571308586, 6: -4.086222130931718, 7: -4.19022476024935, 8: -4.243919389901362, 9: -4.246976004644184, 10: -4.334028831306514, 11: -4.678255063114617}
如果键相同,我试图从两个字典(list2 和 list3)中获取与键关联的值,如果键相同,然后将与列表一具有相同键的 list2 的值与值相乘list1 并为 list1 中的每个字典列表添加这些值。 与列表 3 相同。
for index in range(len(list1)):
tot_pos_probability = 0
tot_neg_probability =0
for the_key, the_value in list1[index][1].items():
for item in list2.keys():
if int(the_key) == item:
tot_pos_probability += int(the_value[0])*list2.get(item)
for elem in list3.keys():
if int(the_key) == elem:
tot_neg_probability += int(the_value[0])*list3.get(elem)
上面的代码完全正常工作,并为我提供了上面列表和字典示例的预期结果。
但我原来的 list1 大小约为 15000,list1 中的每个字典包含大约 200-400 个键值对。同样,两个字典 list2 和 list3 也包含大约 10000 个唯一键值对。在这种情况下,上面的代码工作得非常糟糕。我我无法得到任何结果。它持续运行了 10 分钟,但没有结果。您能否帮我提供一个在这种情况下非常有效的优化解决方案。
您不需要内部for
循环,在这些循环中,您只需检查the_key
是否是 list2 或list3
的键,然后使用您的公式计算tot_pos_probability
和tot_neg_probability
。 您可以改为使用默认值为0
.get()
,这样如果key
不存在,它就不会改变概率。 例子 -
for list1elem in list1:
tot_pos_probability = 0
tot_neg_probability =0
for the_key, the_value in list1elem[1].items():
tot_pos_probability += int(the_value[0])*list2.get(int(the_key), 0)
tot_neg_probability += int(the_value[0])*list3.get(int(the_key), 0)
我看到以下方法有相当大的性能改进。 它可能会帮助你:)
for each in list1:
mykeys = each[1].keys()
mylist = map(int,mykeys)
common1 = set(mylist) & set(list2)
common2 = set(mylist) & set(list3)
if common1:
tot_pos_probability = map(lambda ele: int(each[1][str(ele)][0])*list2[ele], common1)
print sum(tot_pos_probability)
if common2:
tot_neg_probability = map(lambda ele: int(each[1][str(ele)][0])*list2[ele], common2)
print sum(tot_neg_probability)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.