如何在比较两个长二维列表时减少执行时间
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 毫秒。
希望对您有所帮助。
我正在尝试比较两个列表,并将结果附加到另一个列表。
我的问题是执行时间太长,有时会达到 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 毫秒。
希望对您有所帮助。