我正在执行该类型的多次迭代:
masterSet=masterSet.union(setA)
Run Code Online (Sandbox Code Playgroud)
随着集合的增长,执行这些操作所需的时间也在增长(正如人们所预料的那样,我猜).
我希望花时间检查setA的每个元素是否已经在masterSet中?
我的问题是,如果我知道masterSet还没有包含setA中的任何元素,我可以更快地做到这一点吗?
[UPDATE]
鉴于这个问题仍然吸引了观点,我想我会从以下评论和答案中清除一些问题:
虽然迭代虽然有许多迭代,我知道 这些迭代setA会masterSet因为它的构造方式而不同(不必处理任何检查),但是我需要进行一些迭代,我需要进行唯一性检查.
我想知道是否有一种方法可以"告诉" 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)(在一般情况下),因此测试元素是否已经包含在集合中并不是真正的性能影响.
如果您知道您的元素是唯一的,那么集合不一定是最好的结构.
一个简单的列表可以更快地扩展.
masterList = list(masterSet)
masterList.extend(setA)
Run Code Online (Sandbox Code Playgroud)
正如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)
| 归档时间: |
|
| 查看次数: |
30644 次 |
| 最近记录: |