Skip to main content
 首页 » 编程设计

python之在 python 中同时找到元组列表中最大的第一个和第二个项目的最快方法

2025年05月04日18bluestorm

我正在摆弄元组列表,我想知道,同时从元组列表中获取最大的第一个和第二个值的最快方法是什么?例如假设我们有一个这样的元组列表:

_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())))