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

在Python中存储一个字节内存中小于256的整数,python,optimization,type-conversion,Python,Optimization,Type Conversion,我有一个巨大的整数数组,范围在0-255之间。因为我知道整数的范围,所以我想通过将每个整数存储在一个字节内来优化它们所占用的空间 在C++中,我只使用 char < /C>存储整数,但在python中找不到出路。 >>> a = 10 >>> sys.getsizeof(a) 24 >>> b = chr(a) >>> sys.getsizeof(b) 38 >>> c = bytearray(1) >

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

在C++中,我只使用<代码> char < /C>存储整数,但在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的数据类型。
我想知道是否存在一种存储此类整数的空间优化方法。

有一个
字节
类用于存储压缩的字节序列。我不认为有一种简单的方法可以用一个字节的内存存储一个数字

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

这在较大的bytearray中更为明显:

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

您可以使用数组来实现这一点。例如:

import numpy as np

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

有关更多详细信息,请参见其他。

如果您正在处理大型阵列,那么最好使用numpy,它为您提供了许多阵列工具

有一些开销,但它是最小的:

import numpy as np
import sys

a = np.array([0]*10000, np.uint8)    
len(a)
# 10000
sys.getsizeof(a)
# 10048
sys.getsizeof(a[0])
# 13
a = np.array([0]*1000000, np.uint8)
sys.getsizeof(a)
# 1000048

这不是一个10字节的数组。它只有一个(1字节)元素。@Alex错误地键入了构造函数。在标准的
数组
模块中有紧凑的数组。但是,如果您还希望对数据进行快速操作,那么最好使用Numpy。
import numpy as np
import sys

a = np.array([0]*10000, np.uint8)    
len(a)
# 10000
sys.getsizeof(a)
# 10048
sys.getsizeof(a[0])
# 13
a = np.array([0]*1000000, np.uint8)
sys.getsizeof(a)
# 1000048