擅长:python、mysql、java
<p>@雅各布:分配对象的方式有区别,但不是一写就抄。Python分配一个固定大小的“free list”,在这里它可以快速地分配dictionary对象(直到填满为止)。通过<code>{}</code>语法(或对<code>PyDict_New</code>的C调用)分配的词典可以来自这个自由列表。当字典不再被引用时,它将返回到空闲列表,并且该内存块可以被重用(尽管字段首先被重置)。</p>
<p>第一个字典将立即返回到空闲列表,下一个字典将重用其内存空间:</p>
<pre><code>>>> id({})
340160
>>> id({1: 2})
340160
</code></pre>
<p>如果保留引用,则下一个词典将来自下一个空闲插槽:</p>
<pre><code>>>> x = {}
>>> id(x)
340160
>>> id({})
340016
</code></pre>
<p>但我们可以删除对该词典的引用并再次释放它的槽:</p>
<pre><code>>>> del x
>>> id({})
340160
</code></pre>
<p>由于<code>{}</code>语法是用字节码处理的,因此可以使用上述优化。另一方面,<code>dict()</code>的处理就像一个普通的类构造函数,而Python使用通用内存分配器,它不遵循像上面的空闲列表那样容易预测的模式。</p>
<p>另外,从Python2.6的compile.c看,使用<code>{}</code>语法,它似乎可以根据在解析时已知的存储项的数量预先调整哈希表的大小。</p>