我很想知道Python中Bytearray和List之间的内存管理有什么不同。
我找到了一些类似Bytearray和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
我们可以看到,在列表/数组和字节数组之间存在大小差异(4个元素的列表/数组占用36字节,而4个元素的字节数组占用32字节)。有人能解释一下这是为什么吗?对于字节数组来说,它占用了32字节的内存,因为4
个元素(4*8==32)
,这是有道理的,但是如何解释列表和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
个单位?这是否意味着每个内存地址指针都指向半个字节(nibble)?
此外,分配整数的内存的标准是什么?我读到Python会根据整数的值分配更多的内存(如果我错了请纠正),例如数字越大分配的内存越多。
例如:
>>> y = 10
>>> y.__sizeof__()
14
>>> y = 1000000
>>> y.__sizeof__()
16
>>> y = 10000000000000
>>> y.__sizeof__()
18
Python分配内存的标准是什么?为什么Python占用的内存要比C多得多(我的机器是64位),而它们都只处于整数范围内(2**64)?
元数据:
Python版本: '3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]'
机器架构: 64位
附言:请指引我一篇好的文章,以更好地解释Python的内存管理。我已经花了将近一个小时来弄清楚这些事情,最终在Stack Overflow上提出了这个问题 :(
y.__sizeof__()
给出了28
,对于y=10
,y=1M
也是一样的结果,而y=10000000000000
则是32
。 - Pynchia