我正在摆弄元组列表,我想知道,同时从元组列表中获取最大的第一个和第二个值的最快方法是什么?例如假设我们有一个这样的元组列表:
_list = [(0, 3), (2, 1), (3, 2), (2, 4)]
最大第一个值为 3,最大第二个值为 4,因此我想获取元组 (3, 4)。最快的方法是什么?
请您参考如下方法:
在对此处发布的各种脚本(列表长度为 10000)进行计时后,最快的版本是传统的 for 循环:
mi = mj = float('-inf')
for i, j in lst:
if i > mi:
mi = i
if j > mj:
mj = j
print mi, mj
但最漂亮的必须是使用 zip:
lst = [(0, 3), (2, 1), (3, 2), (2, 4)]
print tuple(max(x) for x in zip(*lst))
# -> (3, 4)
计时(在 Python 2.7.1 上):
Function Time Performance
max_for2(lst): 0.9241 100%
max_izip(lst): 1.3093 141%
max_for1(lst): 1.3596 147%
max_zip(lst): 1.4750 159%
max_gen(lst): 2.1235 229%
时间码:
setup = '''
from itertools import izip
from random import randint
def max_zip(lst):
return tuple(max(x) for x in zip(*lst))
def max_izip(lst):
return tuple(max(x) for x in izip(*lst))
def max_gen(lst):
return max(a[0] for a in lst), max(a[1] for a in lst)
def max_for1(lst):
mi = mj = float('-inf')
for i, j in lst:
mi = i if i > mi else mi
mj = j if j > mj else mj
return mi, mj
def max_for2(lst):
mi = mj = float('-inf')
for i, j in lst:
if i > mi:
mi = i
if j > mj:
mj = j
return mi, mj
lst = [(randint(0, 10000), randint(0, 10000)) for _ in xrange(10000)]
'''
from timeit import timeit
statements= (
'max_zip(lst)',
'max_izip(lst)',
'max_gen(lst)',
'max_for1(lst)',
'max_for2(lst)'
)
timings = {}
for stmt in statements:
timings[stmt] = timeit(stmt=stmt, setup=setup, number=1000)
print 'Function\t\tTime\tPerformance'
for key, value in sorted(timings.iteritems(), key=lambda x: x[1]):
print '{}:\t{:.4f}\t{}%'.format(
key, value, int(100*value/min(timings.values())))
