【发布时间】:2016-01-23 13:22:33
【问题描述】:
我很想知道 Bytearray 和 Python 中的列表之间的内存管理有何不同。
我发现了一些问题,例如Difference between bytearray and list,但没有完全回答我的问题。
正是我的问题...
from array import array
>>> x = array("B", (1,2,3,4))
>>> x.__sizeof__()
36
>>> y = bytearray((1,2,3,4))
>>> y.__sizeof__()
32
>>> z = [1,2,3,4]
>>> z.__sizeof__()
36
正如我们所见,list/array.array(4 个元素为 36 字节)和字节数组(4 个元素为 32 字节)之间存在大小差异。有人可以向我解释为什么会这样吗?对于字节数组来说,它为4 元素( 4 * 8 == 32 ) 占用了32 字节的内存是有意义的,但是对于list 和array.array,如何解释呢?
# Lets take the case of bytearray ( which makes more sense to me at least :p)
for i in y:
print(i, ": ", id(i))
1 : 499962320
2 : 499962336 #diff is 16 units
3 : 499962352 #diff is 16 units
4 : 499962368 #diff is 16 units
当每个元素只占用8字节时,为什么这里两个连续元素之间的差异相差16个单位。这是否意味着每个内存地址指针都指向一个半字节?
另外,整数的内存分配标准是什么?我读到 Python 会根据整数的值分配更多的内存(如果我错了,请纠正我)就像数字越大内存越多。
例如:
>>> y = 10
>>> y.__sizeof__()
14
>>> y = 1000000
>>> y.__sizeof__()
16
>>> y = 10000000000000
>>> y.__sizeof__()
18
Python分配内存的标准是什么?
为什么 Python 占用这么多内存,而 C 只占用 8 个字节(我的是 64 位机器)?当它们完全在整数(2 ** 64) 的范围内时?
元数据:
Python 版本: '3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]'
机器架构: 64 位
P.S:请引导我阅读一篇更好地解释 Python 内存管理的好文章。我花了将近一个小时来弄清楚这些事情,最后在 SO 中提出了这个问题。 :(
【问题讨论】:
-
好问题,赞成。嘿,你很幸运:在我的 Linux Xubuntu 64 位机器上,CPython 3.4.3
y.__sizeof__()给我28为y=10,同样为y=1M,32为y=10000000000000 -
嗨@Pynchia,虽然我的机器是64位,但我的是32位python。我不确定,但这可能是原因。让我们等待有人澄清。