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

标签 python algorithm execution-time

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

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

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

我使用的是带有 8Gb RAM 的 i5 第 8 代,使用以下代码获得大约 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 有大约十万个条目。

最佳答案

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

这是一个基本的实现:

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 毫秒。

希望对您有所帮助。

关于python - 如何在比较两个长二维列表时减少执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57158069/

相关文章:

python - 运行示例时在 GridMap 中看到 "ImportError: No module names map_reduce"

algorithm - 红黑树问题

mysql - 如何使用别名列加快此查询的速度?

PHP max_execution_time 显示错误值

c - 下面哪一段代码执行速度更快?

python - 在 Numba 中创建日期数组?

python - Pandas:如果索引存在,则将一列的值添加到另一列

Python 生成器在附加到列表时会创建产量结果的重复项

递归中的 Javascript 'this' 上下文?

algorithm - 将矩形划分为更小的包含 1 个点的矩形,最大化荒地面积