擅长:python、mysql、java
<p>只是提醒一下Python的整数是如何工作的:如果通过</p>
<pre><code>a = [0] * K
</code></pre>
<p>您需要列表的内存(<code>sizeof(PyListObject) + K * sizeof(PyObject*)</code>)和单个整数对象的内存<code>0</code>。只要列表中的数字保持在Python用于缓存的魔法数字<code>V</code>以下,就可以了,因为这些数字是共享的,即任何指向数字的名称<code>n < V</code>都指向完全相同的对象。您可以使用以下代码段找到此值:</p>
<pre><code>>>> i = 0
>>> j = 0
>>> while i is j:
... i += 1
... j += 1
>>> i # on my system!
257
</code></pre>
<p>这意味着一旦计数超过这个数字,您需要的内存就是<code>sizeof(PyListObject) + K * sizeof(PyObject*) + d * sizeof(PyIntObject)</code>,其中<code>d < K</code>是<code>V (== 256)</code>上的整数数。在64位系统上,<code>sizeof(PyIntObject) == 24</code>和<code>sizeof(PyObject*) == 8</code>,即最坏情况下的内存消耗是320000000字节。</p>
<p>使用<code>numpy.ndarray</code>或<code>array.array</code>,初始化后内存消耗是恒定的,但是您要为透明创建的包装器对象付费,正如Thomas Wouters所说。可能,您应该考虑使用<a href="http://cython.org/" rel="noreferrer">Cython</a>或<a href="http://www.scipy.org/Weave" rel="noreferrer">^{<cd12>}</a>将更新代码(访问并增加数组中的位置)转换为C代码。</p>