簡體   English   中英

在未排序的float列表中找到最接近元素的索引的最快方法

[英]Fastest way of finding the index of the closest element in a non-sorted Python list of floats

給定一個未排序的浮點列表作為輸入,找到最接近的元素到某個值的索引的最有效方法是什么? 我想到了一些潛在的解決方案:

對於:

x = random.sample([float(i) for i in range(1000000)], 1000000)

1)自己的功能:

def min_val(lst, val):
    min_i = None
    min_dist = 1000000.0
    for i, v in enumerate(lst):
        d = abs(v - val)
        if d < min_dist:
            min_dist = d
            min_i = i
    return min_i

結果:

%timeit min_val(x, 5000.56)
100 loops, best of 3: 11.5 ms per loop

2)

%timeit min(range(len(x)), key=lambda i: abs(x[i]-5000.56))
100 loops, best of 3: 16.8 ms per loop

3)脾氣暴躁(包括轉換)

%timeit np.abs(np.array(x)-5000.56).argmin()
100 loops, best of 3: 3.88 ms per loop

通過該測試,似乎將列表轉換為numpy數組是最好的解決方案。 但是,我想到兩個問題:

  1. 那確實是一個現實的比較嗎?
  2. numpy解決方案是在Python中實現此目標的最快方法嗎?

考慮QuickSort中的分區算法 分區算法重新排列列表,以使樞軸元素在調用后位於其最終位置。 然后,根據樞軸的值,可以對數組中可能包含最接近目標的元素的部分進行分區。 找到所要查找的元素或具有長度為1的分區(包含元素)后,就可以完成。

您要解決的一般問題是選擇問題

在您的問題中,您想知道要使用哪種數組/列表實現,這將對性能產生影響。 與列表/數組表示法相反,更大的因素將是搜索算法。

根據@Andrzej的評論進行編輯

啊,那我誤會了你的問題。 嚴格來說,線性搜索始終為O(n),因此無論基礎數據結構如何,Big-Oh分析范圍內的效率都是相同的。 這里的陷阱是,對於線性搜索,您需要一個很好的簡單數據結構來盡可能提高運行時性能。

Python列表是對象的引用數組,而(據我所知)Numpy數組是對象的連續數組。 Numpy數組的性能更好,因為它不必取消引用對象即可獲取值。

對於Python列表與Numpy數組,您的比較技術似乎是合理的。 我不願意說Numpy數組是解決問題的最快方法,但它的性能應比Python列表更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM