【Python标准库】LZ77编码的基本原理和lzma模块

news2024/9/24 13:23:20

文章目录

    • lz77编码
    • lzma模块调用

lz77编码

Python标准库总共提供了三种压缩算法,分别是zlib, bz2以及lzma,并且位这三个模块提供了高度相似的API,考虑到zlib中已经对很多定义做了详尽的解读,本文主要介绍一下lzma算法,然后对常用的函数做一个示例。

lzma是Lempel-Ziv-Markov chain-Algorithm的缩写,在2001年被用在著名的7-Zip中,是在Deflate和LZ77算法上的改良和优化,本文主要介绍一下LZ77算法。

LZ77Lempel和Ziv在1977年开发的编码方式,核心思想是利用数据的重复结构信息,从而弥补了霍夫曼编码需要了解先验频率的不足。

主要思路是用一个滑窗对数据进行筛选,其编码流程分为3步:

  1. 从当前压缩位置开始,用一个滑窗在已编码数据中查找与为编码数据据匹配的最长字符串,如果找到则跳到2,否则跳到3。
  2. 输出三元符号组(off, L, c),其中off位匹配字符串相对窗口边界的偏移,L为匹配长度,c为下一个字符。然后将窗口向后滑动L+1个字符,继续步骤1。
  3. 输出单值cc为当前字符,然后将窗口向后滑动一个字符,继续步骤1。

AABCBBABCD为例,下面是LZ77的编码流程

  1. A是第一个字母,再它出现之前,没有任何可供参考的编码数据,所以A就是A
  2. 第二个A就不一样了,由于有了第一个A做参照,所以可以记作(1,1,B),前面的1表示此时滑窗移动1,第二个1表示长度为1,B表示该字母之后是B。至此,已经编码的区域为AAB,记作A(1,1,B)
  3. 当前未编码的区域有CBBABCC无参照,所以直接记下来;BAAB中有出现过,所以记作(3,1,B),2表示窗口向右滑动3位可匹配到B,1表示匹配长度,B表示第二个B。此时已编码字符串为AABCBB,记作A(1,1,B)C(2,1,B)
  4. 此时为编码区域有ABC,正好和AABC中的ABC匹配,记作(2,3,D)

lzma模块调用

稍微讲解一下原理之后,可以先调用一下lzma模块中最关键的两个函数compressdecompress

import lzma
import sys
ori = 'ifyoumissthetrainimonyouwillknowthatiamgone'*10
bOri = ori.encode()
sys.getsizeof(bOri) # 463
c = lzma.compress(bOri)
sys.getsizeof(c)    # 145

未采取压缩时,占内存463;压缩之后剩下145。

除了压缩和解压缩函数之外,lzma还提供了直接与文件交互的open,其封装为

lzma.open(filename, mode='rb', encoding=None, errors=None, newline=None)

lzma模块提供了方便的文件交互函数open,有了这个就可以直接将数据另存为压缩文件了

>>> with lzma.open('test.txt.xz', 'w') as f:
...   f.write(ori.encode())
...
430

而且这个压缩文件可以直接用解压软件打开

在这里插入图片描述

既然能读,那自然能写

>>> with lzma.open('test.txt.xz', 'r') as f:
...    print(f.read())
...
b'ifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgoneifyoumissthetrainimonyouwillknowthatiamgone'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue使用rem, vscode使用px to rem工具

一、使用px2rem-loader实现pxtorem 1、安装 首先,我们使用 vue 的脚手架 vue-cli 初始化一个 webpack 项目(前提是已经安装过 vue-cli,具体不再阐述),一些选项根据自己项目需要选择。 vue init webpack my-app命令执…

深度学习算法数据-网络-算法总结

深度学习算法数据-网络-算法总结 1 数据集大全 通用2D检测数据集、交通标志、车道线、行人检测、3D目标检测、ReID等数据集 2 Backbone知识汇总 该部分主要是针对常见CNN结构以及ViT结构进行汇总,同时也包含轻量化CNN Backbone以及轻量化Transformer模型等高性…

详解pandas的read_excel函数

一、官网参数 pandas官网参数网址:pandas.read_excel — pandas 1.5.2 documentation 如下所示: 二、常用参数详解 1、io 一般指读取文件的路径。【必须指定】 import pandas as pddf pd.read_excel(r"C:\Users\wwb\Desktop\data3.xlsx")p…

chromecast激活

小白误入旁路由添加dns解析(1)外部网络设置不动,内部网络设置第一个dns服务器指向旁路由自己,第二个dns服务器用常用的保证能用就行(2)添加dns解析,把安卓ntp,更新时间的服务器链接成…

一文读懂CPU工作原理、程序是如何在单片机内执行的、指令格式之操作码地址码

文章较长,大家可选择性阅读,嘎嘎细 计算机结构 CPU的运行原理 CPU的控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。由运算器执行对应的机器指令,并将结果通过地…

如何用C++扩展NodeJS的能力?

文章目录前言C结合NodeJS的魅力C和NodeJS怎么结合通过Addon增强NodeJS环境的准备1. node-gyp2. nan (Native abstraction for NodeJS)编写Addon的C代码JS方法的C表示JS方法的传入参数 v8::Argument进阶进阶1: 输出一个JS包装类型进阶2: 使用多线程异步计算最后前言 Javascript…

Qt使用第三方库QXlsx将数据库的数据导出为Excel表格

一、参考和下载第三方库QXlsx 参考1 这篇博客对第三方库QXlsx介绍的比较详细。 1、概述 QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件,可以在Qt5支持的任何平台上使用。 2、使用方式 (1) QXlsx可以编译为静态库库使用(可以提升项目编…

第03讲:使用kubeadm搭建k8s单master集群方案

一、安装前的准备工作 本实验使用1个master节点和2个node节点。 硬件配置(必要):2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多 开始本实验之前请先按照 使用kubeadm搭建k8s集群的准备工作 进行实验前的准备工…

从零开始带你实现一套自己的CI/CD(五)Jenkins+K8s

目录一、简介二、Jenkins K8s2.1 Jenkins配置k8s-master服务器信息2.2 配置镜像仓库信息2.3 编写k8s yaml文件2.4 将yaml文件推送到k8s2.5 配置免密钥登录2.6 k8s部署yaml资源文件2.7 重新部署yaml资源文件2.8 构建注意事项2.9 完整Jenkinsfile2.10 构建成功三、Webhook源码一…

合宙ESP32S3 CameraWebServe 测试demo

合宙ESP32S3 CameraWebServe 合宙ESP32S3 CameraWebServe测试,我们需要一个OV2640的摄像头模组用来采集图像传输给ESP32的,这里使用的OV2640是之前安信可十周年的白嫖的。现在直接插到合宙ESP32S3开发板,简直完美。还是白嫖好!&a…

评估-----评估算法的指标

评估算法的优劣一般会用到以下参数: TN: 真反例 FN: 假反例 TP: 真正例 FP: 假正例 正样本负样本预测正样本TPFP预测负样本FNTN**精确率/查准率(precision):**预测正确的正样本个数与预测为正样本的个数的…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(函数发生器)】

目录 序言 🍍放置虚拟仪器仪表 🍉函数发生器 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0,打开如图所示的启动界面&am…

3-Spring创建

目录 1.创建一个普通的Maven项目 2.添加Spring框架支持(spring-context,spring-beans) 3.添加启动类 1.创建一个普通的Maven项目 不选择任何模板,直接点Next。 Name:项目名称; Location:项目保存路径; …

Lesson 3. 线性回归的手动实现(3.1 变量相关性基础理论 3.2 数据生成器与 Python 模块编写)

文章目录一、变量相关性基础理论二、数据生成器与 Python 模块编写1. 自定义数据生成器1.1 手动生成数据1.2 创建生成回归类数据的函数2. Python 模块的编写与调用在此前的内容当中,我们已经学习了关于线性回归模型的基本概念,并且介绍了一个多元线性回归…

看了以后大呼过瘾的程序员必备网站,速速收藏!

程序员必备的网站,网络上一搜一大把,动辄几十个甚至一百个,虽说大多数网站也都是实用的,但数量庞杂未免让人眼花缭乱。 这里我就只挑选精华,只挑选出程序员必备的8个网站,服务于程序员的工作&生…

Python和MySQL对比(5):用Pandas实现MySQL窗口函数的效果

文章目录一、前言二、语法对比数据表row_number()lead()/lag()rank()/dense_rank()first_value()count()/sum()三、小结一、前言 环境: windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的窗口函数row_number()、lead()/lag()、rank()/dense_ran…

工业互联网蓬勃发展,出奇才能制胜

近年来,随着我国工业数字化转型的快速推进,我国工业发展进入产业新阶段,工业互联网迎来更加强劲的发展动能和更加广阔的发展空间,我国希望把握住新一轮的科技革命和产业革命,推进工业领域实体经济数字化、网络化、智能…

Cassandra入门教程

文章目录一、数据存储方式和NoSQL1.1 数据存储方式1.2 NoSQL概述1.3 NoSQL的分类二、Cassandra的介绍2.1、Cassandra概述2.1.1 来自百科的介绍2.1.2 Cassandra的Logo2.2、Cassandra特点2.3、Cassandra使用场景2.3.1 特征2.3.2 场景举例三、Cassandra下载、安装、访问3.1 Cassan…

Datawhale 吃瓜教程组队学习 task01

Datawhale 吃瓜教程组队学习task01 还没写完,会持续更新~~ 上个月看了周志华老师的机器学习视频课的前三章,但是后面中断了没看…(主要是懒🤐) 于是打算这个月继续来学习西瓜书和南瓜书🤯 Task01:概览西瓜书南瓜书第1、…

【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(上)

目录 一、日志对我们来说到底重不重要? 日志打印的常见级别 二、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 三、EFK 组件详细介绍 3.1 Elasticsearch 组件介绍 3.2 Filebeat 组件介绍 1)Flebeat 和 Beat 关系…