计算 Python 中两组的差异和交集的最有效方法
Most efficient way to compute differences and intersection of two sets in Python
假设我们有两组 s1
和 s2
。
我需要基于这两个集合的三个不同的集合:
- 存在于
s1
但不存在于 s2
中的元素集。
- 存在于
s2
但不存在于 s1
中的元素集。
- 同时存在于
s1
和 s2
中的一组元素。
这些可以很容易地计算如下:
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
o1 = s1 - s2
o2 = s2 - s1
o3 = s1 & s2
有没有办法更有效地计算这些集合?我想不同的集合操作有多个共同的内部处理步骤,所以可能会有冗余。
鉴于这些操作是在语言的核心部分用 C 语言实现的,我认为您几乎无法在自定义代码中加快这些操作的速度。
但是...
由于s1 - s2
与s1 - (s1 & s2)
相同,您可以先计算o3
,然后在差分运算中使用这个较小的集合:
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
o3 = s1 & s2
o1 = s1 - o3
o2 = s2 - o3
我怀疑它会产生很大的不同,因为集合查找和插入的时间复杂度为 O(1),但可以想象,对较小集合的操作仍然稍微快一些。
假设我们有两组 s1
和 s2
。
我需要基于这两个集合的三个不同的集合:
- 存在于
s1
但不存在于s2
中的元素集。 - 存在于
s2
但不存在于s1
中的元素集。 - 同时存在于
s1
和s2
中的一组元素。
这些可以很容易地计算如下:
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
o1 = s1 - s2
o2 = s2 - s1
o3 = s1 & s2
有没有办法更有效地计算这些集合?我想不同的集合操作有多个共同的内部处理步骤,所以可能会有冗余。
鉴于这些操作是在语言的核心部分用 C 语言实现的,我认为您几乎无法在自定义代码中加快这些操作的速度。
但是...
由于s1 - s2
与s1 - (s1 & s2)
相同,您可以先计算o3
,然后在差分运算中使用这个较小的集合:
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
o3 = s1 & s2
o1 = s1 - o3
o2 = s2 - o3
我怀疑它会产生很大的不同,因为集合查找和插入的时间复杂度为 O(1),但可以想象,对较小集合的操作仍然稍微快一些。