我正在尝试加快我编写的程序的速度,在导入 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 View (更快)
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
关于python - 提高在列表中查找项目索引的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55426829/