繁体   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