擅长:python、mysql、java
<p>虽然<code>in</code>操作的时间复杂度是<code>O(n)</code>,因此整个操作是<code>O(nm)</code>,但这主要适用于它如何随问题大小而扩展。性能方面,除了最坏情况下<code>A</code>和<code>B</code>互斥之外,执行<code>for B if i in A</code>(其中<code>len(A) > len(B)</code>)应该更快,因为一旦找到匹配项<code>in</code>就会停止迭代。你知道吗</p>
<p>考虑一下最佳情况,<code>A</code>和<code>B</code>中的所有条目都具有相同的值。<code>in</code>操作实际上是<code>O(1)</code>和整个操作<code>O(m)</code>。你知道吗</p>
<p>每个人都喜欢的一些基准:</p>
<pre><code>$ 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
</code></pre>
<p>撇开性能不谈,请注意,您提供的两个函数<em>的作用不同</em>。第一个循环遍历<code>A</code>并丢弃未出现在<code>B</code>中的值,这与循环遍历<code>B</code>并丢弃未出现在<code>A</code>中的值不同。回到两个列表中的所有值都相同的场景,第一个函数将返回<code>len(A)</code>元素,而第二个<code>len(B)</code>元素。你知道吗</p>