python - 提高在列表中查找项目索引的速度

标签 python numpy multidimensional-array vectorization numpy-ndarray

我正在尝试加快我编写的程序的速度,在导入 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/

相关文章:

python - 如何以编程方式检查python包是否是最新版本?

python - Theano 逻辑回归维度不匹配

java - NullPointerException,使用数组预订座位

javascript - 如何将 JSON 对象作为新级别添加到另一个 JSON 对象?

python - 在 matplotlib 中操纵线宽以进行孵化

python - 同时在多个数据库上运行 django 迁移

python - 获取列表中匹配元素的简洁方法

python - 使用 matplotlib.animation 从 matplotlib 制作视频后创建的空 .mp4 文件

Python:从两个列表中将数据透视表创建为 numpy 二维数组

c - 通过引用将动态二维数组传递给另一个函数来分配动态二维数组