当我想在列表中获取元组的第二个元素的 sum
时,我只使用列表理解:
elements = [(1,2), (3,50), (4, 5000)]
sumOfSecondItems = [x[1] for x in elements]
但是,我在SO帖子上找到了许多解决方案。在许多方法下,创建一个dict和概括它的值是最快的。
sum(dict.values())
如何比其他方法更快?
这是其基准的其他方法:归功于原始作者
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
您的计时代码没有比较同一件事;使用代码:
elements = [(1,i) for i in range(100000)]
所有对将具有1
作为第一个元素,这意味着dict(elements)
仅包含一个元素。
print(dict([(1,2),(1,3)])) # --> displays {1:3}