Python isDisjoint() 运行时
Python isDisjoint() runtime
Python 2.7 的 isDisjoint(other)
集合方法的算法运行时间是多少?它比简单地执行 intersection(other)
然后检查返回的交集的 len()>0
更快吗?
两种情况下的复杂度都将是 O(min(len(s), len(t))
。唯一的区别是 intersection
创建一组新的所有匹配项,而 isdisjoint
只是 returns 一个布尔值,并且可以在找到匹配项后立即短路。
马上短路的例子:
>>> s1 = set(range(10**6))
>>> s2 = set([0] + list(range((10**6), 2 * (10**6))))
>>> s1.intersection(s2)
set([0])
>>> %timeit s1.isdisjoint(s2)
10000000 loops, best of 3: 94.5 ns per loop
>>> %timeit s1.intersection(s2)
100 loops, best of 3: 6.82 ms per loop
在这种情况下,时间彼此接近,表明在循环过程中找到匹配项的时间很晚。
>>> s1 = set(range(10**6))
>>> s2 = set(range((10**6) - 1, 2 * (10**6)))
>>> s1.intersection(s2)
set([999999])
>>> %timeit s1.isdisjoint(s2)
100 loops, best of 3: 5.37 ms per loop
>>> %timeit s1.intersection(s2)
100 loops, best of 3: 6.62 ms per loop
Python 2.7 的 isDisjoint(other)
集合方法的算法运行时间是多少?它比简单地执行 intersection(other)
然后检查返回的交集的 len()>0
更快吗?
两种情况下的复杂度都将是 O(min(len(s), len(t))
。唯一的区别是 intersection
创建一组新的所有匹配项,而 isdisjoint
只是 returns 一个布尔值,并且可以在找到匹配项后立即短路。
马上短路的例子:
>>> s1 = set(range(10**6))
>>> s2 = set([0] + list(range((10**6), 2 * (10**6))))
>>> s1.intersection(s2)
set([0])
>>> %timeit s1.isdisjoint(s2)
10000000 loops, best of 3: 94.5 ns per loop
>>> %timeit s1.intersection(s2)
100 loops, best of 3: 6.82 ms per loop
在这种情况下,时间彼此接近,表明在循环过程中找到匹配项的时间很晚。
>>> s1 = set(range(10**6))
>>> s2 = set(range((10**6) - 1, 2 * (10**6)))
>>> s1.intersection(s2)
set([999999])
>>> %timeit s1.isdisjoint(s2)
100 loops, best of 3: 5.37 ms per loop
>>> %timeit s1.intersection(s2)
100 loops, best of 3: 6.62 ms per loop