<p>一个鲜为人知的事实是,您不需要构造<code>set</code>来执行此操作:</p>
<p>在Python 2中:</p>
<pre><code>In [78]: d1 = {'a': 1, 'b': 2}
In [79]: d2 = {'b': 2, 'c': 3}
In [80]: d1.viewkeys() & d2.viewkeys()
Out[80]: {'b'}
</code></pre>
<p>在Python 3中,用<code>keys</code>替换<code>viewkeys</code>;这同样适用于<code>viewvalues</code>和<code>viewitems</code>。</p>
<p>从<code>viewitems</code>的文档中:</p>
<pre><code>In [113]: d1.viewitems??
Type: builtin_function_or_method
String Form:<built-in method viewitems of dict object at 0x64a61b0>
Docstring: D.viewitems() -> a set-like object providing a view on D's items
</code></pre>
<p>对于较大的<code>dict</code>s,这也比构造<code>set</code>s并与它们相交稍快:</p>
<pre><code>In [122]: d1 = {i: rand() for i in range(10000)}
In [123]: d2 = {i: rand() for i in range(10000)}
In [124]: timeit d1.viewkeys() & d2.viewkeys()
1000 loops, best of 3: 714 µs per loop
In [125]: %%timeit
s1 = set(d1)
s2 = set(d2)
res = s1 & s2
1000 loops, best of 3: 805 µs per loop
For smaller `dict`s `set` construction is faster:
In [126]: d1 = {'a': 1, 'b': 2}
In [127]: d2 = {'b': 2, 'c': 3}
In [128]: timeit d1.viewkeys() & d2.viewkeys()
1000000 loops, best of 3: 591 ns per loop
In [129]: %%timeit
s1 = set(d1)
s2 = set(d2)
res = s1 & s2
1000000 loops, best of 3: 477 ns per loop
</code></pre>
<p>我们在这里比较纳秒,这对你来说可能重要,也可能不重要。在任何情况下,都会返回一个<code>set</code>,因此使用<code>viewkeys</code>/<code>keys</code>可以消除一点混乱。</p>