为什么从地图迭代器中获取值需要这么长时间?

时间:2018-03-06 14:57:43

标签: python optimization

我有两个词典,ABA是字典词典。二级词典中的键与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

如果AB足够大,则需要很长时间。

出于好奇,我删除了sum()以查看会发生什么。删除sum()会使其运行得更快。我尝试了其他方法,例如,从地图中制作一个列表然后求和。

似乎在地图对象上做任何事情都是瓶颈。

是否有另一种更快捷的方法来获取map迭代器中值的总和?

是否有更快的方式获得最终总和?

注意:我刚刚找到了Q& A.它回答了我的一个问题。 python map, list(map), lambda and performance

1 个答案:

答案 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