M=range(100)
L=range(100,200)
timeit set(L) & set(M)
10000 loops, best of 3: 32.3 µs per loop
timeit any(x in M for x in L)
1000 loops, best of 3: 374 µs per loop
timeit m_set=frozenset(M);any(x in m_set for x in L)
10000 loops, best of 3: 31 µs per loop
L=range(50,150)
timeit set(L) & set(M)
10000 loops, best of 3: 18 µs per loop
timeit any(x in M for x in L)
100000 loops, best of 3: 4.88 µs per loop
timeit m_set=frozenset(M);any(x in m_set for x in L)
100000 loops, best of 3: 9.39 µs per loop
# Now for some random lists
import random
L=[random.randrange(200000) for x in xrange(1000)]
M=[random.randrange(200000) for x in xrange(1000)]
timeit set(L) & set(M)
1000 loops, best of 3: 420 µs per loop
timeit any(x in M for x in L)
10 loops, best of 3: 21.2 ms per loop
timeit m_set=set(M);any(x in m_set for x in L)
1000 loops, best of 3: 168 µs per loop
timeit m_set=frozenset(M);any(x in m_set for x in L)
1000 loops, best of 3: 371 µs per loop
首先,如果不需要对它们进行排序,那么切换到
set
类型。如果仍然需要列表类型,请按以下方式执行:0==False
或者更简洁
如果你真的需要
True
或False
在进行了一些计时之后,这似乎也是一个不错的选择
如果M或L中的项不可散列,则必须使用这样一种效率较低的方法
下面是100个项目列表的一些计时。当没有交集时,使用集合的速度要快得多,而当有一个相当大的交集时,使用集合的速度要慢得多。
为了避免构建交叉点的工作,并在我们知道交叉点后立即给出答案:
更新:gnibbler尝试了这个方法,发现使用set()代替frozenset()可以更快地运行。什么事。
相关问题 更多 >
编程相关推荐