gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:42 24 4
gpt4 key购买 nike

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

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

关于python - 在 python 中同时找到元组列表中最大的第一个和第二个项目的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com