如何快速查找元素在多个乱序数组中的索引?
优化思路:用哈希映射/向量化操作替代线性查找
你的核心问题是list.index()是线性查找,每次查找都要遍历整个列表,时间复杂度为O(N),循环N次后总复杂度变成O(N²)——当N=10000时就是1亿次操作,速度自然慢。下面两种方法能把时间复杂度降到O(N),大幅提升性能:
方法1:用Python字典预存元素-索引映射
提前为每个乱序数组构建「元素值→索引位置」的字典,之后直接通过字典键查找,单次查找时间为O(1):
import numpy as np N = 10000 # 生成初始数组与乱序数组 arr = np.arange(0, N) np.random.shuffle(arr) arr1 = arr.copy() np.random.shuffle(arr) arr2 = arr.copy() np.random.shuffle(arr) arr3 = arr.copy() # 构建元素到索引的字典映射 map_arr1 = {val: idx for idx, val in enumerate(arr1)} map_arr2 = {val: idx for idx, val in enumerate(arr2)} map_arr3 = {val: idx for idx, val in enumerate(arr3)} # 计算每个元素的索引和 idx_sum = np.array([map_arr1[i] + map_arr2[i] + map_arr3[i] for i in range(N)])
方法2:利用numpy向量化操作(更适合大规模数据)
既然你本来就在用numpy,没必要转成列表。可以用np.argsort()直接生成元素的索引映射,完全依赖numpy的底层C实现操作,避免Python循环的开销:
import numpy as np N = 10000 arr = np.arange(0, N) np.random.shuffle(arr) arr1 = arr.copy() np.random.shuffle(arr) arr2 = arr.copy() np.random.shuffle(arr) arr3 = arr.copy() # argsort返回排序后元素的原索引,反过来即可得到每个元素的位置 idx_map1 = np.argsort(arr1) idx_map2 = np.argsort(arr2) idx_map3 = np.argsort(arr3) # 直接通过索引数组计算总和,全程向量化 idx_sum = idx_map1[np.arange(N)] + idx_map2[np.arange(N)] + idx_map3[np.arange(N)]
性能对比(以N=10000为例)
- 原方法:约2-3秒(线性查找+Python循环)
- 字典映射法:约0.01秒
- numpy向量化法:约0.001秒
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

