相关文章推荐
冷冷的红金鱼  ·  欢迎访问《实验力学》编辑部网站!·  10 月前    · 
逆袭的打火机  ·  恶果之地,游戏攻略-哔哩哔哩_Bilibili·  11 月前    · 
追风的炒粉  ·  資通安全責任等級分級辦法應辦事項-其他- ...·  11 月前    · 
深情的奔马  ·  明日之子第二季27强名单_综艺资讯_大众网·  1 年前    · 
侠义非凡的毛衣  ·  歌手陈红最新现状命运多舛与演员陈红大不相同·  1 年前    · 
小百科  ›  取用 Python 对数据成功进行填充-腾讯云开发者社区-腾讯云
云数据 zlib 压缩率 数据压缩
乖乖的手术刀
2 年前
作者头像
杜逸先
0 篇文章

使用 Python 对数据进行压缩

原创
前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 追不上乌龟的兔子 > 使用 Python 对数据进行压缩

使用 Python 对数据进行压缩

原创
作者头像
杜逸先
修改 于 2021-06-10 11:51:04
3.4K 0
修改 于 2021-06-10 11:51:04
举报

之前在工作中遇到一个需求,需要在手机 小程序 端获取到微信小商店店铺的所有商品数据。由于当时我们没有在后台维护用户的商品数据,选择的解决方案是现场调用商品列表接口,然后缓存在 Redis 里。

鉴于 Redis 的内存还是比较宝贵的,而用户的商品数据(转化为 json 格式后)又是一些比较有规律的文本数据,比较适合进行数据压缩,于是我调研了一下 Python 中的 数据压缩的方案。

zip 标准库

Python 中有一个标准库 zip ,常用来处理 zip 格式文件,提供的函数和方法也更适合文件操作。在这个案例中我们的数据是通过 http 接口获取的,额外进行一些文件操作有些麻烦和多余, zip 标准库并不适合这个场景。

zlib 标准库

zlib 是一个常用的压缩、解压库,使用了 deflate 算法。 zip 和 unzip 工具背后其实用的就是 zlib 。Python 内置了 zlib 标准库,提供的接口也很简洁易用( zlib.compress 和 zlib.decompress )。

import zlib
raw = b'abc' * 100
compressed = zlib.compress(raw)
print(f'compress ratio =  {len(compressed)/len(raw):.2}') # compress ratio =  0.05
assert zlib.decompress(compressed) == raw

<!-- more -->

zlib 可以显著压缩数据规模。当然这个例子比较极端,重复了一百遍'abc',能达到 5%的压缩率。在真实场景下, zlib 大概能将原始数据压缩到 40%到 50%的大小。

zlib.compress 函数的第二个参数 level 表示压缩级别,范围从 0 到 9,数值越低表示压缩速度越快但压缩率也越高(0 表示只编码而不进行压缩),默认值是-1,在 Python 中一般会使用级别 6。我们可以对比一下不同级别的速度和压缩率。

可以看到,在压缩《西游记》小说原文的场景中,级别 1 和级别 9 的压缩率从 50%提高到了 44%,但级别 1 的耗时只有级别 9 的 20%。在数据大小敏感的场景下下,1%的压缩率的提高也是很可观的。

我遇到的这个场景数据是要存在 Redis 里的,并且每个店铺的数据规模有限,倾向于使用更高的压缩率的方案。

lzma 标准库

Python 标准库中的 lzma (顾名思义,使用 lzma 算法)同样可以用于数据压缩,并且有着更高的压缩率,提供的接口与 zlib 也很相似。

使用 lzma 可以达到三分之一的压缩率,比级别最高的 zlib 压缩率还要高十多个百分点,相对应的,压缩速度和解压速度会慢很多。

在实验中, 使用 lzma 压缩和解压《西游记》的原文的时间是使用级别 9 zlib 的四倍多。

考虑到微信小商店每个店铺的商品不会很多,花在压缩上的 CPU 时间并不长,还要考虑到请求商品列表接口的耗时,我最后在这个业务中选用了 lzma 标准库。

zstd

zlib 和 lzma 都是 Python 标准库,可以开箱即用。Pypi 上还是有一些其他的数据压缩、解压的库,在这里介绍一下 zstd 。

zstd (Zstandard)是 Facebook 推出的一个压缩算法,提供 zlib 级别的实时压缩速率和更高的压缩比。标准的 zstd 实现是官方的 C lib,在 Pypi 上也有同名的 Python 绑定实现。

在我遇到的这个场景下,解压的数据量不会太大,这一点解压速度的提升还不值得引入一个第三方库。当然遇到更合适的场景的话, zstd 库还是大有所为的。

总结

作为一个自带电池的语言,了解并活用 Python 标准库还是会很大程度上提高开发效率的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 [email protected] 删除。

python

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 [email protected] 删除。

python
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
杜逸先
杭州美登科技股份有限公司资深研发工程师
0
文章
0
累计阅读量
0
获赞
前往专栏
目录
  • zip标准库
  • zlib标准库
  • lzma标准库
  • zstd
  • 总结
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
冷冷的红金鱼  ·  欢迎访问《实验力学》编辑部网站!
10 月前
逆袭的打火机  ·  恶果之地,游戏攻略-哔哩哔哩_Bilibili
11 月前
追风的炒粉  ·  資通安全責任等級分級辦法應辦事項-其他- 資安法常見問題- 資安法規 ...
11 月前
深情的奔马  ·  明日之子第二季27强名单_综艺资讯_大众网
1 年前
侠义非凡的毛衣  ·  歌手陈红最新现状命运多舛与演员陈红大不相同
1 年前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南