我试图通过循环遍历数组的行并检查内部值是否匹配条件来搜索 python 2D 数组。一个例子在这里:
def searchList(list, v0, v1, v2, v3):
for r in range(len(list)):
if (list[r][0] == v0) & (list[r][1] == v1) & (list[r][2] == v2) & (list[r][3] == v3):
return r
return None
然而,与其他语言相比,Python 的速度相当慢。
现在的主要问题是这个列表是动态增长的,并且可能有 1000 行或更多行。
当我上网搜索如何加快速度时,我发现将列表移动到 numpy 矩阵并使用 np.where()
可以做到这一点。
def searchList(list, v0, v1, v2, v3):
tmpQ = np.array(list)
locList = np.where((tmpQ[:,0] == v0) & (tmpQ[:,1] == v1) & (tmpQ[:,2] == v2) & (tmpQ[:,3] == v3))
if locList[0].size == 0:
return None
else:
return locList[0][0]
现在的问题是,将 python 2D 数组转换为 numpy 矩阵,这个操作也需要很多时间。
我的另一个选择是摆脱 python 2D 数组,只使用 numpy 矩阵,但这也不起作用,因为矩阵不断增长,连接操作需要很长时间。
有什么办法可以快速做到这一点吗?
我知道是什么导致使用 cProfile 并运行代码花费最多时间。
这取决于您的数据形状,您可以尝试以下操作:
def searchList(mylist, v0, v1, v2, v3):
try:
row_num = mylist.index([v0, v1, v2, v3])
except ValueError:
return None
return row_num
m = [[1,2,3,4], [5,6,7,8], [3,2,8,7], [1,3,6,9]]
print(searchList(m, 3, 2, 8, 7))
输出:
2
我是一名优秀的程序员,十分优秀!