python中“in”和“for”操作的效率

时间:2012-08-15 08:45:06

标签: python performance

我这里有两个名单,名为A和B.

len(A) > len(B)

有两种方法可以做某事:

方法一:

def f():
    return [someFunc(i) for i in A if i in B]

方法二:

def f():
    return [someFunc(i) for i in B if i in A]

哪一个更有效率,为什么?

3 个答案:

答案 0 :(得分:4)

两者都是O(mn),因为你在另一个列表的每个元素上迭代每个列表。

答案 1 :(得分:4)

虽然in操作的时间复杂度为O(n),因此整个操作为O(nm),但这主要适用于它如何根据问题大小进行扩展。性能方面,除了AB相互排斥的最坏情况之外,for B if i in Alen(A) > len(B))之后应该更快{{1}一旦找到匹配,就会停止迭代。

考虑最佳情况,其中inA中的所有条目具有相同的值。 B操作实际上是in和整个操作O(1)

每个人都喜欢,有些基准:

O(m)

除了性能之外,请注意您提供的两个功能不会做同样的事情。第一个遍历$ python -m timeit "A=list(range(100000));B=list(range(100))" "[i for i in A if i in B]" 10 loops, best of 3: 113 msec per loop $ python -m timeit "A=list(range(100000));B=list(range(100))" "[i for i in B if i in A]" 100 loops, best of 3: 2.6 msec per loop 并丢弃A中未显示的值,这与迭代B并丢弃B中未显示的值不同。回到两个列表中所有值相同的场景,第一个函数将返回A元素,而第二个len(A)元素。

答案 2 :(得分:3)

def f(A, B):
    return [someFunc(_) for _ in set(A).intersection(B)]

应该是最有效的方法(至少如果列表足够长,时间复杂度有问题)