为冻结的python应用程序更快地导入zipfile
zipimportx的Python项目详细描述
这个包旨在加速从zipfiles导入冻结的python应用程序(以及 假设zipfile不会改变的其他场景 标准zipimport模块不可用的快捷方式。
它导出了一个有用的名字“zipimporter”,这是一个替代品 对于标准的Zipimporter类。替换内置的zipimport机制 使用zipimportx,请执行以下操作:
import zipimportx zipimportx.zipimporter.install()
在没有额外工作的情况下,您可能已经发现导入时有一个小的加速 从拉链里拿出来的。因为zipimportx假设zipfile不会更改或 丢失,它比标准的stat()调用和完整性检查更少 Zipimport实现。
为了进一步加快ZipFile的加载速度,可以预先计算ZipImport “目录信息”字典并将其存储在单独的索引文件中。这个 将减少从zipfile解析信息所花费的时间。创建 这样的索引文件:
from zipimportx import zipimporter zipimporter("mylib.zip").write_index()
这将创建包含预解析zip file的文件“mylib.zip.idx” 目录信息。具体来说,它将包含一个编组字典 对象的结构与zipimport中的结构相同。
在我的测试中,使用这些索引可以通过 在Linux上是3倍,在Windows上是5倍。
要进一步加速加载模块集合,可以“预加载” 直接包含在索引中的实际模块数据。这使得 多个模块的数据将加载到单个顺序读取中,而不是 需要对每个模块进行单独的读取。这样预加载模块数据:
from zipimportx import zipimporter zipimporter("mylib.zip").write_index(preload=["mymod*","mypkg*"])
“preload”列表中的每个条目都是一个文件名模式。来自zipfile的文件 与这些模式匹配的文件将在zipfile第一次加载时预加载 可用于导入。你可能想把它们从 为了节省空间。
最后,可以将zipfile转换为内联python代码并包括 直接在冻结的应用程序中的代码。这可以模拟效果 在sys.path上设置zipfile,同时在导入期间避免任何fie io 过程。要获取必要的源代码,请执行以下操作:
from zipimportx import zipimporter code = zipimporter("mylib.zip").get_inline_code()
最后,值得重新迭代这个模块所做的大假设: zipfile决不能更改或丢失。如果索引中的数据没有 反映zipfile的实际内容,导入将在未指定的 可能还有一些荒谬的方式。
还要注意,这个包只使用内置模块。引导 zipfile导入对于冻结的应用程序,可以内联此模块的代码 直接进入应用程序的启动脚本。只是做些类似的事情 这在您的构建过程中:
import zipimportx import inspect SCRIPT = ''' %s zipimporter.install() import myapp myapp.main() ''' % (inspect.getsource(zipimportx),) freeze_this_script_somehow(SCRIPT) zipimportx.zipimporter("path/to/frozen/library.zip").write_index()