有没有并行的方法可以比较两个大整数列表?

时间:2019-04-23 20:57:46

标签: python multithreading list performance comparison

我有800万个唯一整数列表,这些整数代表书籍的ID。问题是此列表每学期都会更改(删除的ID,新的ID)。仅使用列表理解来获取“新ID”或“已擦除ID”的新列表是永远的事。

我确实尝试了两种操作来查找先前描述的两个项目(擦除的ID,新的ID)

l1 = [1,2,3,4,5]
l2 = [0,2,3,4,6,7]

new_ids = [x for x in l2 if x not in l1]
erased_ids = [x for x in l1 if x not in l2]

是否有并行方法来处理这些比较以获得更好的性能?

1 个答案:

答案 0 :(得分:2)

您可以尝试通过多处理来做到这一点,但这并不能为您带来太大帮助,因为它只会将计算答案的时间缩短一半。您说这需要永远,并且永远/ 2仍然永远。您需要其他算法。尝试套装

set1 = set(l1)
set2 = set(l2)

new_ids = list(set2 - set1)
erased_ids = list(set1 - set2)

您的算法在O(n ^ 2)中运行。这是因为[x for x in l2 if x not in l1]为l2中的每个x检查l1的全部。如果l1和l2有8m个元素,则需要8000000 ^ 2 = 160000000000000个支票。

相反,集合是一种数据结构(内部使用哈希),可以在一个操作或O(1)中检查元素成员资格。从理论上讲,检查集合中是否包含数字x花费的时间是相同的,无论该集合包含一个元素还是800万个元素。对于列表不是这样。

也可以减去设置。 set2 - set1的意思是“ set2中没有的东西”。这是在O(n)时间完成的,我以为是通过进行n O(1)个成员资格检查来实现的。

首先构建对象集也是O(n)的时间,因为添加到集合中是O(1)操作,您必须对n个元素进行操作。

因此,整个算法运行时间为O(n)。