[英]Best way to find minimum x and y values in a list of pairs in python?
给定数据列表:
[[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, -1], [2, 0], [1, 1], [0, 2]]
在python中获得最低的X和Y最快的方法是什么。 在这种情况下,[-1,-1]。
不确定它是最快的,但可能是最短和最“ pythonic”的:
>>> map(min, zip(*data))
[-1, -1]
更新:我也使用10000个随机子列表和100次迭代对此进行了一些时序分析。 事实证明,它比Aशwini的itemgetter
解决方案要快一点,但是普通for
-loop仍然是最快的:
0.400840 min_mapminzip
0.579334 min_itemgetter
0.292459 min_loop
那是针对Python 2.x ...以及Python 3,其中zip
, map
等是迭代器,这是另一个故事:
0.186229 min_mapminzip # wrong result, see below
0.686008 min_itemgetter
0.336031 min_loop
更正:在map
是迭代器的情况下,我忘记应用list
,从而创建了迭代器,但没有做任何实际工作...感谢gnibbler和Aशwini指出了这一点! 使用list(map(...))
,执行时间与Python 2.x差不多,即普通的旧循环仍然是最快的。
更新2:有趣的是,“ map-min-zip”解决方案仅对于相对短的列表(“短”)(约10,000个项目)更快。 对于更长的列表(约100,000或更多),“ itemmetter”解决方案变得更快。 普通的for循环总是最快的...
您可以在此处使用min
:
>>> from operator import itemgetter
>>> lst = [[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, -1], [2, 0], [1, 1], [0, 2]]
>>> x = min(lst, key=itemgetter(0))[0]
>>> y = min(lst, key=itemgetter(1))[1]
>>> x, y
(-1, -1)
在我的系统上(i5 4670)需要9秒钟的时间约1秒:
In [3]: lst = lst*10**6
In [4]: %timeit (min(lst, key=itemgetter(0))[0], min(lst, key=itemgetter(1))[1])
1 loops, best of 3: 1.01 s per loop
普通的单循环版本大约需要341毫秒:
def find_min(seq):
min_x = float('inf')
min_y = float('inf')
for x, y in seq:
if x < min_x : min_x = x
if y < min_y : min_y = y
return min_x, min_y
时序比较:
len(lst)
Out[42]: 9000000
%timeit find_min(lst)
1 loops, best of 3: 341 ms per loop
%timeit map(min, zip(*lst))
1 loops, best of 3: 1.21 s per loop
%timeit map(min, izip(*lst))
1 loops, best of 3: 1.14 s per loop
%timeit (min(lst, key=itemgetter(0))[0], min(lst, key=itemgetter(1))[1])
1 loops, best of 3: 1.04 s per loop
minima = data[0]
for pair in data[1:]:
minima = map(min, zip(pair, minima))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.