如果我们知道元素是唯一的,那么扩展集合的快速方法

Ste*_*t_R 26 python union set

我正在执行该类型的多次迭代:

masterSet=masterSet.union(setA)
Run Code Online (Sandbox Code Playgroud)

随着集合的增长,执行这些操作所需的时间也在增长(正如人们所预料的那样,我猜).

我希望花时间检查setA的每个元素是否已经在masterSet中?

我的问题是,如果我知道masterSet还没有包含setA中的任何元素,我可以更快地做到这一点吗?

[UPDATE]

鉴于这个问题仍然吸引了观点,我想我会从以下评论和答案中清除一些问题:

虽然迭代虽然有许多迭代,我知道 这些迭代setAmasterSet因为它的构造方式而不同(不必处理任何检查),但是我需要进行一些迭代,我需要进行唯一性检查.

我想知道是否有一种方法可以"告诉" masterSet.union()程序不要再费心于这次的单一性检查了,因为我知道这一点不同于masterSet仅仅添加这些元素,很快就相信程序员的断言他们肯定会受到干扰.Perhpas通过调用一些不同的" .unionWithDistinctSet()"程序或其他东西.

我认为答案已经表明这是不可能的(并且真正设置操作应该足够快)但是使用masterSet.update(setA)而不是联合作为其稍微快一点.

我接受了最清楚的回应,解决了我当时遇到的问题并继续我的生活,但是如果我的假设.unionWithDistinctSet()能够存在,我仍然会喜欢听到这个问题吗?

mgi*_*son 51

您可以使用它set.update来更新主集.这样可以节省分配新的设置,因此它应该比set.union... 快一点.

>>> s = set(range(3))
>>> s.update(range(4))
>>> s
set([0, 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

当然,如果你在循环中这样做:

masterSet = set()
for setA in iterable:
    masterSet = masterSet.union(setA)
Run Code Online (Sandbox Code Playgroud)

通过执行以下操作可能会提升性能:

masterSet = set().union(*iterable)
Run Code Online (Sandbox Code Playgroud)

最终,集合的成员资格测试是O(1)(在一般情况下),因此测试元素是否已经包含在集合中并不是真正的性能影响.


njz*_*zk2 6

如果您知道您的元素是唯一的,那么集合不一定是最好的结构.

一个简单的列表可以更快地扩展.

masterList = list(masterSet)
masterList.extend(setA)
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 5

正如mgilson所指出的,您可以用来update从另一个集合中就地更新一个集合。实际上可以更快地完成工作:

def union():
    i = set(range(10000))
    j = set(range(5000, 15000))
    return i.union(j)

def update():
    i = set(range(10000))
    j = set(range(5000, 15000))
    i.update(j)
    return i

timeit.Timer(union).timeit(10000)   # 10.351907968521118
timeit.Timer(update).timeit(10000)  # 8.83384895324707
Run Code Online (Sandbox Code Playgroud)