[英]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]),)
這里接受的答案使用np.array_equal
,它首先檢查形狀,然后進行all(==)
測試。
另一個SO: 檢查Python中的3d數組中是否存在2d數組?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.