比较两个长2D列表时如何减少执行时间

2024-04-19 19:03:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的问题是执行时间太长了,有时大约是40秒,这取决于列表的大小。我无法对列表进行排序和相互比较,因为我是从一个更大维度的列表中获得列表的,所以我需要保存索引位置。你知道吗

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

我使用的是i58thgen,8gbram,执行时间约为10-30秒,代码如下。 我无法对列表进行排序和相互比较,因为我是从一个更大维度的列表中获得列表的,所以我需要保存索引位置。你知道吗

这是我写的代码:

这里lists是我的List1(3D数组),y是我的List2(2D数组),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有大约十万个条目。你知道吗


Tags: 代码iniddefault列表for排序时间
1条回答
网友
1楼 · 发布于 2024-04-19 19:03:33

您可以将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)

将列表1中的100000个项目检查为列表2中的10000个项目需要1.49毫秒

希望有帮助。你知道吗

相关问题 更多 >