如何在比较两个长二维列表时减少执行时间

How to reduce execution time while comparing two long 2D lists

我正在尝试比较两个列表,并将结果附加到另一个列表。

我的问题是执行时间太长,有时会达到 40 秒左右,具体取决于列表的大小。我无法对列表进行排序和比较,因为我是从更大维度的列表中获取列表,所以我需要保留索引位置。

第一个列表(List1) 是3D 列表,而第二个列表(List2) 是2D 列表。所以我需要比较 List1 的前两个维度和 List2 的前两个维度,当我得到匹配时,我将另一个值附加到使用 List1 的第三维度制作的第三个列表中。

我正在使用带有 8Gb RAM 的 i5 第 8 代,并通过以下代码获得大约 10-30 秒的执行时间。 我无法对列表进行排序和比较,因为我是从更大维度的列表中获取列表,所以我需要保留索引位置。

这是我写的代码:

这里lists是我的List1(三维数组),y是我的List2(二维数组),damage_id是一个4-5个元素的小列表。

import timeit

start = timeit.default_timer()
x = 0
a = 0
n = len(damage_id)
lists_classes = [[] for _ in range(n)]

while x < len(damage_id):
    #print(x)

    for i in lists[x]:
        for j in y:
            if (i[0],i[1]) == j:
                lists_classes[x].append(class_names_list[y.index(j)])
                break

    x = x + 1

stop = timeit.default_timer()
print('Time: ', stop - start)

如果你们能告诉我一些方法或超调来减少执行时间,我将非常感谢你们。请注意 List1 和 List2 是相当长的列表,List1 的长度可变(3D),而 List2 有大约十万个条目。

您可以将list2转换成set,然后检查list1的前两个元素是否在set中。这应该会大大提高你的表现。

这是一个基本的实现:

import random

# a big 3-D array of lists
l1 = [ 
    [
        random.choice([i for i in range(10)]), 
        random.choice([i for i in range(10, 20)]), 
        random.choice([i for i in range(20, 30)])
    ] 
    for _ in range(10_000) 
] 

# big array of 2D lists
l2 = [(random.choice([i for i in range(20)]), int(random.random() * 100) % 20) for x in range(100000)] 

s = set(l2)

# %%timeit 
for point in l1: 
    x, y, z = point 
    if (x,y) in s: 
        pass
# 1.49 ms ± 158 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

检查 list1 中的 100,000 个项目到 list2 中的 10,000 个项目集需要 1.49 毫秒。

希望对您有所帮助。