整数的可变长度编码
varints的Python项目详细描述
这是一个python模块,旨在帮助实现可变长度 将整数(和整数列表)编码为更紧凑的 使用较少内存的表示。
内存使用说明
通常在python中,整数存储为 long 这意味着它们将至少使用32位。当存储多个数字时 它不需要32位,这看起来很重要 浪费;可变长度表示应该能够帮助 这种情况。
不幸的是,python 2提供了以下内容
>>>importsys>>>i=1>>>sys.getsizeof(i)12>>>b=bytearray([0]*4)>>>sys.getsizeof(b)29
在python 3中情况也没有好转
>>>importsys>>>i=1>>>sys.getsizeof(i)14>>>b=bytearray([0]*4)>>>sys.getsizeof(b)33
但是我们可以看到,bytearray的python开销是 固定的。增加bytearray的大小只会增加内存 按使用的字节数使用:
>>>importsys>>>b1=bytearray([0])>>>sys.getsizeof(b1)30>>>b10=bytearray([0]*10)>>>sys.getsizeof(b10)40
所以这意味着目前:
- python 3中bytearray对象的内存开销比 Python2
- 使用变量编码实际上会消耗我们的内存,而不是 为我们节省内存
如果我们考虑数列,情况会好一些。如果我们 以我们要存储10个零的地方为例。可变编码 应该意味着每个零都可以存储在一个字节中,这意味着 我们最终会得到一个有10个元素的小房间。所以…
>>>importsys>>>i1=[0]*10>>>i1[0,0,0,0,0,0,0,0,0,0]>>>sys.getsizeof(i1)72>>>b1=bytearray(i1)>>>sys.getsizeof(b1)36
意思是:
- 在以下情况下,使用变量编码有可能节省内存: 我们正在存储整数数组
- 我们存储的内存量将取决于 正在存储。变量表示越大,则 保存,因此需要存储更多的数字以便 补偿ByteArray开销
- 为了节省这个内存,我们将产生一个处理开销。 例如
- 随机访问存储在bytearray中的变量将是o(n)而不是 大于o(1)
- 每次我们想转换为 变量表示法
那么为什么要在python中使用varint呢?如果我们需要一个紧凑的方法 存储一个(通常是很小的)数字列表 需要随机访问包含的数字。
一个应用程序在 tree-search。通常 我们最终会有一些节点保存在内存中,而不是 在处理树中的其他节点时访问。如果我们愿意 存储与每个节点相关联的状态(例如棋子上的棋子 然后我们可以将它们表示为整数列表并最小化 使用各种表示法的内存使用情况。