检查两个长嵌套列表中的变量时加快 for 循环
Speed up a for loop when checking variables in two long nested lists
我有两个嵌套列表,每个列表包含 15000 个列表,每个列表有 5 个变量。我检查每个子列表中的两个变量与另一个变量以查找匹配项。如果两个变量都匹配,则不应执行任何操作,如果不匹配,子列表 lagerProduct
中的变量应设置为 0,并且 lagerProduct
应附加到 self.mainlist
。最终输出是 self.mainlist
,它包含所有 self.hovedfil
+ 来自 self.lagerfil
的子列表。工作代码如下,但速度不是很快。我怎样才能加快速度?
match = False
self.lagerFil = self.mainlist #15000 sublists with 5 values in each sublist
self.hovedFil = [[]] #15000 sublists with 5 values in each sublist
for lagerProduct in self.lagerFil:
for produktHoved in self.hovedFil:
if lagerProduct[0] == produktHoved[0] and lagerProduct[3] == produktHoved[3]:
match = True
if match == False:
lagerProduct [4] = 0
self.mainlist.append(lagerProduct)
else:
match = False
您的问题是,对于 mainlist 中的 15000 个元素中的每一个,您在 hovedFil 中迭代了 15000 多个元素(即使在找到匹配项之后您继续检查剩余的元素),也就是 2.25 亿次迭代。
还有其他问题,例如您在遍历 self.mainlsit 的同时还附加到它(只是为列表分配另一个名称不会复制列表)。
您应该将 hovedFil 转换为 set()
,然后搜索变为 O(1),并且应该使用匹配的产品构建一个单独的列表:
matches = set((p[0], p[3]) for p in self.hovedFil)
matchedProducts = [
lagerProduct for lagerProduct in self.lagerFil
if (lagerProduct[0], lagerProduct[3]) not in matches]
我有两个嵌套列表,每个列表包含 15000 个列表,每个列表有 5 个变量。我检查每个子列表中的两个变量与另一个变量以查找匹配项。如果两个变量都匹配,则不应执行任何操作,如果不匹配,子列表 lagerProduct
中的变量应设置为 0,并且 lagerProduct
应附加到 self.mainlist
。最终输出是 self.mainlist
,它包含所有 self.hovedfil
+ 来自 self.lagerfil
的子列表。工作代码如下,但速度不是很快。我怎样才能加快速度?
match = False
self.lagerFil = self.mainlist #15000 sublists with 5 values in each sublist
self.hovedFil = [[]] #15000 sublists with 5 values in each sublist
for lagerProduct in self.lagerFil:
for produktHoved in self.hovedFil:
if lagerProduct[0] == produktHoved[0] and lagerProduct[3] == produktHoved[3]:
match = True
if match == False:
lagerProduct [4] = 0
self.mainlist.append(lagerProduct)
else:
match = False
您的问题是,对于 mainlist 中的 15000 个元素中的每一个,您在 hovedFil 中迭代了 15000 多个元素(即使在找到匹配项之后您继续检查剩余的元素),也就是 2.25 亿次迭代。
还有其他问题,例如您在遍历 self.mainlsit 的同时还附加到它(只是为列表分配另一个名称不会复制列表)。
您应该将 hovedFil 转换为 set()
,然后搜索变为 O(1),并且应该使用匹配的产品构建一个单独的列表:
matches = set((p[0], p[3]) for p in self.hovedFil)
matchedProducts = [
lagerProduct for lagerProduct in self.lagerFil
if (lagerProduct[0], lagerProduct[3]) not in matches]