Python源文件的压缩

时间:2011-07-30 09:57:49

标签: python compression

我有大约700个大小为几千字节的Python源文件(.py)(平均文件大小为12 kB,但也有很多1 kB文件),我想创建一个压缩存档包含所有这些存档。我的要求:

  • 存档应该很小。 (.zip文件给我的压缩比为3.816,我需要的东西比那个小。用.rar创建的rar -s -m5 a文件给我压缩比为6.177,我更喜欢7或者更。)
  • 压缩必须是无损的,它必须逐位保留原始文件。 (所以缩小了。)
  • 必须有一个用C编写的小型库,可以列出存档并提取单个文件。
  • 解压缩库必须快速,即速度不比zlib慢,最好更快。
  • 如果我想提取单个文件,我不必解压缩存档中较大的,无关的部分。 (因此压缩的.tar文件已经输出,并且固定的.rar文件已经用完了。)
  • 由于所有.py文件都很小(只有几千字节),我不需要流式解压缩器或在文件中寻求支持。
  • 如果可能,应该从.py文件的并集生成的上下文字典初始化解压缩,以节省更多空间。

您推荐哪种压缩算法和C解压缩库?

我知道代码缩小的概念(例如删除注释和额外的空格,将局部变量重命名为单个字母),我会考虑将这种技术用于我的一些.py文件,但是在这个问题中我对它不感兴趣。 (参见Python缩小器here。)

我知道字节码编译的概念(.pyc文件),但在这个问题中,我对此并不感兴趣。 (我不想在归档中使用字节码的原因是字节码依赖于架构和版本,因此它的可移植性较差。.pyc文件往往比缩小.py文件大一点。文件。)

查看我的答案,其中包含计划B和计划C.我仍在寻找计划A,它比ZIP小(但最有可能大于.tar.xz),并且它的开销小于{ {1}}。

3 个答案:

答案 0 :(得分:3)

我知道你已经拒绝了.zip,但是如果你意识到Python已经能够直接从zip文件中导入包,那么它可能会改变你的决定。除了setuptools配置文件外,不需要额外的代码。

答案 1 :(得分:2)

您应该考虑LZMA(另请参阅C SDK)。

答案 2 :(得分:0)

FYI Plan B只是使用ZIP文件。这就是我目前正在做的事情。在ZIP存档中存储.py文件对于Python非常方便,因为Python可以直接从ZIP存档加载.py个文件。但我需要比ZIP文件小的东西,这就是我问这个问题的原因。

FYI C计划使用.tar.xz。这是分析。 Linux内核和Busybox 1.8.5包含一个.xz解压缩器,它编译为18 kB的x86代码,满足了我对小型解压缩库的要求。 .tar.xz xz -6 -C crc32.tar文件的压缩比为6.648。为x86编译的Busybox 1.8.5的.xz解压缩器的开销是代码大小为17840字节(将可执行文件与.tar.xz文件进行比较)。所以这是计划C:当可执行文件启动时,将整个存档提取到内存中。 (这在我的机器上大约需要0.35秒,输出是9MB内存块。)要从存档中读取文件,请使用其内存中的未压缩表示。这将非常快。此备份计划不是我的问题的解决方案,因为它在执行开始时涉及0.35秒的开销,并且它需要9MB的额外内存。