我正在尝试加快编写的程序的速度,在导入cProfile之后,我发现一个函数会占用大量的计算时间。
就是这样,它在列表中找到一个numpy.ndarray:
def locate(arr, l ):
for i in range(len(l)):
if np.all(l[i] == arr):
return i
return -1
由于无法排序列表,因此我看不到任何方法可以避免扫描整个列表。我已经阅读了一些有关矢量化的文章,我想知道是否可以将其应用于此处,或者是否还有其他方法可以加快速度?
谢谢
答案 0 :(得分:2)
您可能无法避免走列表,但可以加快比较速度:
设置示例:
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:使用无效视图(更快)
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
答案 1 :(得分:1)
有一个名为index()
的内置python函数,您可以在其中插入字符串作为值并在列表中找到其索引,以使用它。
答案 2 :(得分:0)
您是否正在寻找np.where
temp_list=np.array(temp_list)
np.where(temp_list==5)
(array([1, 3, 6, 8]),)
答案 3 :(得分:0)