为什么在列表中获得第二个元组总和最快?

时间:2017-12-03 07:28:06

标签: python list dictionary sum

直觉上,当我想在列表中获取元组的第二个元素的sum时,我只使用列表推导:

elements = [(1,2), (3,50), (4, 5000)]
sumOfSecondItems = [x[1] for x in elements] 

但是,我在SO Post找到了很多解决方案。在许多方法中,创建一个dict并将它的值相加可以证明是最快的。

  

为什么sum(dict.values())比其他方法更快?

以下是基准测试的其他方法:归功于原始的author

setup = 'elements = [(1,i) for i in range(100000)];from operator import itemgetter'
method1 = 'sum([x[1] for x in elements])'
method2 = 'sum(map(itemgetter(1), elements))'
method3 = 'sum(dict(elements).values())'
method4 = 'sum(zip(*elements)[1])'

import timeit
t = timeit.Timer(method1, setup)
print('{0:<40}{1:<30}'.format("list Comprehension: ",t.timeit(100)))
t = timeit.Timer(method2, setup)
print('{0:<40}{1:<30}'.format("map: ",t.timeit(100)))
t = timeit.Timer(method3, setup)
print('{0:<40}{1:<30}'.format("dict: ",t.timeit(100)))
t = timeit.Timer(method4, setup)
print('{0:<40}{1:<30}'.format("zip: ",t.timeit(100)))
  

结果

list Comprehension:                     0.461558960271                
map:                                    0.539129069451                
dict:                                   0.198271294849                
zip:                                    1.02714035879 

1 个答案:

答案 0 :(得分:1)

你的计时代码没有比较同样的事情;代码:

 elements = [(1,i) for i in range(100000)]

所有对都将1作为第一个元素,这意味着dict(elements)只包含一个元素。

print(dict([(1,2),(1,3)])) # --> displays {1:3}