整数的可变长度编码

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无法在未设置数据源的情况下启动springboot应用程序   返回/泛型的类型?   java通过在navigationView中按id重新加载navigationView内容   java实现安卓的状态更新   java Equals()对于两个相等的字符串不返回true   java如何保存屏幕截图(matlab)   java GWT如何在重新加载页面之前确保函数已完全执行   java在Groovy中实现ObjectJSON映射的标准方法是什么?   java在ApacheTomcat中,是否可以通过连接器过滤多个访问日志文件?   java当JVM达到其Xmx限制时,它会强制垃圾收集吗?   如何在JAVA中生成包含特定数字的不同随机数列表?   rcp中透视图之间的java切换   java理解名为“分区”的Linkedlist算法中的无限循环   RestTemplate的java测微计统计信息   Android中使用自定义服务BLE的java读/写特性   java验证输入以确保负数   关于Java扫描器的io基本查询   java如何使用子字符串或其他函数将字符串拆分为单词?   java Storm群集重复元组