簡體   English   中英

提高查找列表中項目索引的速度

[英]Increasing the speed of finding an index of an item in list

我正在嘗試加速我編寫的程序,在導入cProfile之后,我發現一個函數占用了大量的計算時間。

就是這樣,它在列表中找到了一個numpy.ndarray:

    def locate(arr, l ):
        for i in range(len(l)):
            if np.all(l[i] == arr):
                return i
        return -1

由於列表無法訂購等,我看不到任何方法可以避免掃描整個列表。 我已經閱讀了一些關於矢量化的文章,我想知道是否可以在這里應用,或者是否還有其他方法來加快速度?

謝謝

你可能無法避免走在列表中,但你可以加快比較:

設置示例:

L  = list(np.floor(np.outer(*2*(np.linspace(1,10,1000),))))
arr = L[537]

直接參考方法:

import itertools as it

next(it.chain((i for i, a in enumerate(L) if np.all(arr==a)), (-1,)))
# 537
timeit(lambda: next(it.chain((i for i, a in enumerate(L) if np.all(arr==a)), (-1,))), number=100)
# 0.27100146701559424

方法1:使用np.array_equal (較慢)

next(it.chain((i for i, a in enumerate(L) if np.array_equal(arr, a)), (-1,)))
# 537
timeit(lambda: next(it.chain((i for i, a in enumerate(L) if np.array_equal(arr, a)), (-1,))), number=100)
# 0.2992244770284742

方法2:使用void視圖(更快)

arr_v = arr.reshape(-1).view(f'V{arr.itemsize*arr.size}')

next(it.chain((i for i, a in enumerate(L) if arr_v==a.reshape(-1).view(f'V{a.itemsize*a.size}')), (-1,)))
# 537
timeit(lambda: next(it.chain((i for i, a in enumerate(L) if arr_v==a.reshape(-1).view(f'V{a.itemsize*a.size}')), (-1,))), number=100)
# 0.11853155982680619

有一個名為index()的內置python函數,您可以通過將字符串作為值插入並在列表中查找其索引來使用它。

所以你在尋找np.where

temp_list=np.array(temp_list)
np.where(temp_list==5)
(array([1, 3, 6, 8]),)

暫無
暫無

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

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