整数的可变长度编码

varints的Python项目详细描述


Build Status

这是一个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。通常 我们最终会有一些节点保存在内存中,而不是 在处理树中的其他节点时访问。如果我们愿意 存储与每个节点相关联的状态(例如棋子上的棋子 然后我们可以将它们表示为整数列表并最小化 使用各种表示法的内存使用情况。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
数组Java For Loop没有输出(我认为)它应该如何输出   java Maven可以在一个模块中打包两个jar,使用相同的文件名但不同的图表集吗?   java OData读取单个实体最佳实践   java为什么我的代码在以下条件下返回false?   java QueryDsl投影元素集合   在为Java Swing元素实现ActionListener时,如何解决静态引用错误?   libGDX设置允许我使用java8,它在Android中崩溃   如何将日期从shell脚本传递到java即时数据类型   java如何向JList添加复选框和图像   java如何编写这个Listview?   java Eclipse每项目构建设置   java如何将spring引导应用程序指向外部jar的logback。xml   java更改EditText的下划线/样式。。。。。不是链接,而是水平滚动文本   java JPQL:使用复合键建模具有多个关系的查询实体   javascript如何获取Java中的最后32个字节   sql检查Java Derby中是否存在架构   java如何从视图中获取MVC Spring控制器中jstl select的所有项   java gson在需要对象时遇到空数组问题