由于会员小鸡大约是O(1)集,您可以使用内any()
内置函数生成器表达式:
rng = range(6, 9)
any(i in setA for i in rng)
注意,对于短距离你给一个更好的性能set.intersection()
:
In [2]: a = {1,4,7,9,10}
In [3]: rng = range(6, 9)
In [8]: %timeit bool(a.intersection(rng))
1000000 loops, best of 3: 344 ns per loop
In [9]: %timeit any(i in a for i in rng)
1000000 loops, best of 3: 620 ns per loop
但在这种情况下,较长的范围,你肯定会与any()
去:
In [10]: rng = range(6, 9000)
In [11]: %timeit any(i in a for i in rng)
1000000 loops, best of 3: 620 ns per loop
In [12]: %timeit bool(a.intersection(rng))
1000 loops, best of 3: 233 µs per loop
并注意any()
表现更好的原因是因为它在遇到您的集合中存在的项目(基于我们的成员条件)之后立即返回True,因为数字8在它所产生的范围的开始处每个表格的any()
如此之快。同样如在评论中提到的,作为用于检查集合内可迭代的交集的有效性的更pythonic方式,可以使用isdisjoint()
方法。下面是用这种方法对小愤怒的基准:
In [26]: %timeit not a.isdisjoint(rng)
1000000 loops, best of 3: 153 ns per loop
In [27]: %timeit any(i in a for i in rng)
1000000 loops, best of 3: 609 ns per loop
,这里是一个基准,使any()
检查会员的所有数字这表明isdisjoint()
表现这么好:
In [29]: rng = range(8, 1000)
In [30]: %timeit any(i in a for i in rng)
1000000 loops, best of 3: 595 ns per loop
In [31]: %timeit not a.isdisjoint(rng)
10000000 loops, best of 3: 142 ns per loop
他们总是ints? – Denziloe
是的,总是int – user1179317