为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2021-03-25 14:14:20
我正在执行该类型的多次迭代:masterSet=masterSet.union(setA)随着集合的增加,执行这些操作所需的时间也越来越长(我想这是人们所期望的)。我希望花费时间检查setA的每个元素是否已经在masterSet中?我的问题是,如果我知道masterSet还没有包含setA中的任何元素,我可以更快地做到这一点吗?[更新]鉴于这个问题仍在引起人们的关注,我想我将从下面的评论和答案中澄清一些事情:当进行迭代时,虽然我知道 许多迭代与迭代setA是不同的,但masterSet由于迭代的构造方式(无需处理任何检查),但有几次迭代需要进行唯一性检查。我想知道是否有一种方法可以“告诉”masterSet.union()程序这次不打扰唯一性检查,因为我知道这与masterSet仅添加这些元素并相信程序员的断言是完全不同的。Perhpas通过调用一些不同的.unionWithDistinctSet()程序来完成。我认为响应表明这是不可能的(无论如何,真正设置好的操作应该足够快),但还是要使用masterSet.update(setA)代替Union来稍快一些。我已经接受了最明确的答复,解决了我当时遇到的问题并继续生活,但是仍然想听听我的假设.unionWithDistinctSet()是否可能存在吗?
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

如果您知道元素是唯一的,则集合不一定是最佳结构。


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


masterList = list(masterSet)

masterList.extend(setA)


查看完整回答
反对 回复 2021-03-30
?
青春有我

TA贡献1784条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信