我这里有两个名单,名为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]
哪一个更有效率,为什么?
答案 0 :(得分:4)
两者都是O(mn),因为你在另一个列表的每个元素上迭代每个列表。
答案 1 :(得分:4)
虽然in
操作的时间复杂度为O(n)
,因此整个操作为O(nm)
,但这主要适用于它如何根据问题大小进行扩展。性能方面,除了A
和B
相互排斥的最坏情况之外,for B if i in A
(len(A) > len(B)
)之后应该更快{{1}一旦找到匹配,就会停止迭代。
考虑最佳情况,其中in
和A
中的所有条目具有相同的值。 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)]
应该是最有效的方法(至少如果列表足够长,时间复杂度有问题)