我有一个巨大的数组(数组),整数范围为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的数据类型。
我想知道是否存在一种存储这种整数的空间最佳方式。
答案 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
类用于存储打包的字节序列。我认为使用一个字节的内存只存储一个数字的简单方法。
>>> 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