<p><code>sys.getsizeof</code>是检查内存使用情况的一种方法,尽管您必须明智地使用它,了解它到底在测量什么。对于数组,它工作得相当好。你知道吗</p>
<p>没有任何元素的数组:</p>
<pre><code>In [28]: sys.getsizeof(np.array([],'U6'))
Out[28]: 96
In [29]: sys.getsizeof(np.array(['smile','smile1'],'U6'))
Out[29]: 144
In [30]: sys.getsizeof(np.array(['smile','smile1'],'S6'))
Out[30]: 108
</code></pre>
<p>对于2个'U6'字符串,大小会跳跃48,4字节/字符*2个元素*6个字符/元素</p>
<p>对于bytestring数据类型(Py2的默认值),跳转是12,2*6。你知道吗</p>
<p>bytestring更紧凑,但请注意显示:</p>
<pre><code>In [31]: np.array(['smile','smile1'],'S6')
Out[31]: array([b'smile', b'smile1'], dtype='|S6')
</code></pre>
<p>对于对象数据类型:</p>
<pre><code>In [32]: sys.getsizeof(np.array(['smile','smile1'],object))
Out[32]: 112
</code></pre>
<p>16个字节-2*8</p>
<p>但是再加上Python字符串的大小,额外的133字节</p>
<pre><code>In [33]: sys.getsizeof('smile')
Out[33]: 78
In [34]: sys.getsizeof('smile1')
Out[34]: 55
</code></pre>
<p>对于bytestsrings:</p>
<pre><code>In [36]: sys.getsizeof(b'smile')
Out[36]: 38
In [37]: sys.getsizeof(b'smile1')
Out[37]: 39
</code></pre>
<p>注意,当我添加一个字节字符时,大小会增加1。但当我添加一个unicode字符时,大小实际上会减小。unicode字符串的大小更难预测。我认为它可以为每个字符分配最多4个字节,但实际数量取决于字符和编码。通常我们不会尝试微管理Python的字符串处理。(除此之外,我相信Python还有一些字符串缓存。)</p>
<p>但当你分配</p>
<pre><code>X[ind1] = 'smile'
X[ind2] = 'smile2'
</code></pre>
<p>在object情况下,创建两个Python字符串,并将引用(指针)分配给数组。所以内存使用是数组(1000…*8字节)加上这两个字符串的133字节。你知道吗</p>
<p>在“U6”情况下,每个元素占用4*6字节,而不管它是“smile”还是“smile1”(或“s”)。数组的每个元素使用相同的空间,而不管是否需要所有元素来表示字符串。你知道吗</p>
<p>一般来说,字符串不是<code>numpy</code>强度。当字符串具有相似的大小时,'U'或'S'数据类型的内存使用是可以的,但是如果字符串长度不同、重复和/或是unicode,则不太理想。<code>numpy</code>本身不做太多的字符串处理。<code>np.char</code>函数只是Python字符串方法的精简包装。你知道吗</p>
<p><code>pandas</code>选择使用<code>object</code>数据类型而不是字符串数据类型。你知道吗</p>