Python源文件的压缩

1 投票
3 回答
2112 浏览
提问于 2025-04-16 22:34

我有大约700个Python源文件(.py),每个文件大小只有几千字节(平均每个文件12 kB,但也有很多1 kB的文件)。我想把它们打包成一个压缩档案。我的要求如下:

  • 这个档案要小一点。(.zip文件的压缩比是3.816,我需要更小的。用rar -s -m5 a创建的.rar文件压缩比是6.177,我希望能达到7或更高。)
  • 压缩必须是无损的,必须逐位保留原始文件。(所以不能使用压缩代码的方式。)
  • 需要有一个小型的C语言库,可以列出档案内容并提取单个文件。
  • 解压缩的库要快,也就是说,速度不能比zlib慢,最好是更快。
  • 如果我想提取一个单独的文件,不需要解压缩档案中不相关的大部分内容。(所以压缩的.tar文件不行,固态的.rar文件也不行。)
  • 由于所有的.py文件都很小(只有几千字节),我不需要流式解压缩或在文件内寻址的支持。
  • 如果可能的话,解压缩应该从一个由所有.py文件的联合生成的上下文字典中初始化,以节省更多空间。

你推荐使用什么压缩算法和C语言解压缩库?

我知道代码压缩的概念(例如,去掉注释和多余的空格,把局部变量重命名为单个字母),我会考虑对一些.py文件使用这种技术,但在这个问题中我不感兴趣。(可以在这里查看一个Python代码压缩器 这里。)

我知道字节码编译的概念(.pyc文件),但在这个问题中我不感兴趣。(我不想在档案中包含字节码的原因是,字节码依赖于架构和版本,所以可移植性较差。而且.pyc文件通常比压缩后的.py文件大一点。)

请查看我包含计划B和计划C的回答。我仍在寻找计划A,它要比ZIP小(但可能会比.tar.xz大),并且它的开销要比.tar.xz小。

3 个回答

2

你可以考虑使用 LZMA(也可以看看 C SDK)。

4

我知道你已经拒绝了.zip格式的文件,但如果你知道Python其实可以直接从.zip文件中导入包,可能会改变你的想法。这些包以egg文件的形式存在。除了需要一个setuptools的配置文件,其他的代码都不需要额外写。

0

顺便说一下,计划B就是使用ZIP文件。这是我现在正在做的。把.py文件存放在ZIP压缩包里对Python来说非常方便,因为Python可以直接从ZIP压缩包中加载.py文件。不过我需要比ZIP文件更小的东西,这就是我提问的原因。

顺便提一下,计划C是使用.tar.xz。这里有个分析。Linux内核和Busybox 1.8.5里有一个.xz解压缩工具,它编译后只有18KB的代码,这满足了我对小型解压缩库的需求。使用xz -6 -C crc32压缩的.tar.xz文件,相比于.tar文件,压缩比为6.648。Busybox 1.8.5的.xz解压缩工具在x86架构下的代码大小是17840字节(这是把可执行文件和.tar.xz文件进行比较)。所以这就是计划C:当可执行文件启动时,把整个压缩包提取到内存中。(在我的机器上,这大约需要0.35秒,输出是一个9MB的内存块。)要从压缩包中读取文件,就用它在内存中未压缩的表示。这会非常快。不过这个备选方案并不能解决我的问题,因为它在执行开始时需要0.35秒的额外时间,并且需要9MB的额外内存。

撰写回答