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

2024-09-28 20:55:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

masterSet=masterSet.union(setA)

随着集合的增长,执行这些操作所需的时间也在增长(我想,正如人们所期望的那样)。

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

我的问题是,如果我知道主集在setA中不包含任何元素,我可以更快地做到这一点吗?

[更新]

鉴于这个问题仍然吸引着人们的意见,我想我可以从下面的评论和回答中澄清一些问题:

当我在很多迭代中迭代时,我知道setAmasterSet是不同的,因为它是如何构造的(不需要处理任何检查),但是有一些迭代我需要唯一性检查。

我想知道是否有办法“告诉”这个masterSet.union()过程这次不用去做唯一性检查,因为我知道这个过程和masterSet是不同的,只要快速添加这些元素,相信程序员的断言,它们肯定是不一致的。通过调用一些不同的“.unionWithDistinctSet()”过程或其他东西。

我认为响应表明这是不可能的(而且真正的set操作应该足够快),但是使用masterSet.update(setA)而不是union,因为它稍微快一些。

我已经接受了最明确的回应,解决了当时的问题,继续我的生活,但我还是很想知道我的假设是否存在?


Tags: 元素类型过程时间评论断言程序员意见
3条回答

正如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

您可以使用set.update就地更新主集。这节省了一直分配新集合的时间,因此应该比set.union快一点。。。

>>> s = set(range(3))
>>> s.update(range(4))
>>> s
set([0, 1, 2, 3])

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

masterSet = set()
for setA in iterable:
    masterSet = masterSet.union(setA)

您可能会通过以下方式提高性能:

masterSet = set().union(*iterable)

最终,集的成员资格测试是O(1)(在平均情况下),因此测试元素是否已经包含在集中并不是一个真正的性能大问题。

如果你知道你的元素是独一无二的,那么一个集合不一定是最好的结构。

一个简单的列表扩展起来要快得多。

masterList = list(masterSet)
masterList.extend(setA)

相关问题 更多 >