我有两个词典,A
和B
。 A
是字典词典。二级词典中的键与B
中的键匹配。
例如,A
可以是:
A[key1][key_1] = 1
A[key1][key_2] = 4
A[key1][key_3] = 2
A[key2][key_2] = 5
A[key3][key_1] = 1
A[key3][key_3] = 2
和B
可以是:
B[key_1] = 7
B[key_2] = 8
B[key_3] = 9
我已经写了一个循环,将A
的每个键中的值乘以B
for Akey in A.keys():
sum_Akey[Akey] = sum(map(lambda x: A[Akey][x]*B[x], B))
其中sum_Akey
是用于存储总和的字典。它由与A
中的顶级键相同的值键控。
例如:sum_Akey[key1] = 1*7 + 4*8 + 2*9 = 57
如果A
和B
足够大,则需要很长时间。
出于好奇,我删除了sum()
以查看会发生什么。删除sum()
会使其运行得更快。我尝试了其他方法,例如,从地图中制作一个列表然后求和。
似乎在地图对象上做任何事情都是瓶颈。
是否有另一种更快捷的方法来获取map
迭代器中值的总和?
是否有更快的方式获得最终总和?
注意:我刚刚找到了Q& A.它回答了我的一个问题。 python map, list(map), lambda and performance
答案 0 :(得分:0)
lambda
的 map
效率低下。您可以通过理解来看到一些性能提升:
from collections import defaultdict
import random
A = defaultdict(lambda: defaultdict(int))
B = {}
n = 1000
for i in range(n):
for j in range(n):
A[i][j] = random.randint(0, 9)
B = {i: random.randint(0, 9) for i in range(n)}
def original():
for Akey in A.keys():
sum_Akey[Akey] = sum(map(lambda x: A[Akey][x]*B[x], B))
return sum_Akey
def new():
return {Akey: sum(A[Akey][x] * B[x] for x in B) for Akey in A}
%timeit original() # 1 loop, best of 3: 345 ms per loop
%timeit new() # 1 loop, best of 3: 289 ms per loop