[英]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.