<p>注意,<a href="https://docs.python.org/2/library/sys.html#sys.getsizeof" rel="nofollow">^{<cd1>}</a>给出了对象本身的大小,但这并不是全部。一个对象具有各种<em>属性</em>,这些属性也会影响整个内存占用。例如,一个类的实例有一个<code>__dict__</code>,它保存其属性的值:</p>
<pre><code>>>> o = O()
>>> o.__dict__
{}
>>> sys.getsizeof(o.__dict__)
140
</code></pre>
<p>注意三件有趣的事:</p>
<ol>
<li>这也是一个字典-这个数据结构在Python中被大量使用,因此得到了非常好的优化</li>
<li>在<code>o.__dict__</code>中没有任何内容,因为<code>var1</code>和<code>var2</code>是<em>类属性</em>,存储在<code>O</code>,而不是<em>实例属性</em>;并且</li>
<li>尽管<code>o.__dict__</code>中没有任何内容,但它的大小仍然与<code>dt</code>相同,因为字典的初始化空间足以容纳(IIRC)8个键,以避免在向字典添加项时频繁调整大小(有关字典实现的更多信息,请参阅<a href="https://www.youtube.com/watch?v=C4Kc8xzcA68" rel="nofollow"><em>"The Mighty Dictionary"</em></a>)。你知道吗</li>
</ol>
<p>另请注意,如果我们比较两种情况下的实例<em>和类</em>的大小(这是一个更公平的比较),差距就会缩小:</p>
<pre><code>>>> sys.getsizeof(o) + sys.getsizeof(O)
484
>>> sys.getsizeof(dt) + sys.getsizeof(dict)
576
</code></pre>
<blockquote>
<p>Does the example makes objects more effective over dictionaries?</p>
</blockquote>
<p>一点也不;首先,如我所示,对象通常是使用</em>字典来实现的(有一种方法可以通过在类上定义<code>__slots__</code>预定义属性来避免为每个实例创建<code>__dict__</code>,但我在这里就不谈了),字典本身就是对象(尽管内置类型略有不同,原因我就不多说了)!你知道吗</p>
<p>一般来说,除非出现问题,否则不要担心内存细节—如果需要state<em>和</em>行为(attributes<em>和</em>方法),请定义一个类;如果只需要state,请使用字典。你知道吗</p>