在Python的内存字节中存储小于256的整数

时间:2016-03-02 18:38:15

标签: python optimization type-conversion

我有一个巨大的数组(数组),整数范围为0-255。因为我知道整数的范围,所以我想通过将每个整数存储在一个字节内来优化它们占用的空间。

在C ++中,我只是使用char来存储整数,但我无法在Python中找到出路。

>>> a = 10
>>> sys.getsizeof(a)
24
>>> b = chr(a)
>>> sys.getsizeof(b)
38
>>> c = bytearray(1)
>>> c[0] = b
>>> c[0]
10
>>> sys.getsizeof(c[0])
24
>>> c
bytearray(b'\n')
>>> sys.getsizeof(c)
50

我搜索过Python中可用的数据类型,但是我无法获得任何可以使sys.getsizeof()等于1的数据类型。 我想知道是否存在一种存储这种整数的空间最佳方式。

3 个答案:

答案 0 :(得分:4)

sys.getsizeof(c[0])没有报告用于存储c的第一个元素的实际内存量。访问c[0]使得Python构造一个整数对象(或从小整数缓存中获取一个)来表示该值,但是bytearray将该值存储为一个字节。

使用更大的bytearray时更明显:

>>> sys.getsizeof(bytearray([5]*1000))
1168

你可以看到这个bytearray不可能每个元素使用超过1个字节,或者它的大小至少为2000个字节。 (多余的空间是由于过度分配以容纳额外的元素,以及一些对象开销。)

答案 1 :(得分:2)

您可以使用numpy数组。 E.g:

import numpy as np

byte_array = np.empty(10, np.uint8) # an array of 10 uninitialized bytes

有关详细信息,请参阅其他numpy array constructors

答案 2 :(得分:1)

有一个bytes类用于存储打包的字节序列。我认为使用一个字节的内存只存储一个数字的简单方法。

Documentation for bytes

>>> bytes.fromhex('2Ef0 F1f2  ')
b'.\xf0\xf1\xf2'

>>> sys.getsizeof(bytes.fromhex(''))
33
>>> sys.getsizeof(bytes.fromhex('dead'))
35
>>> sys.getsizeof(bytes.fromhex('deadbeef'))
37