跳转到主要内容

为冻结的Python应用程序提供更快的zipfile导入

项目描述

此包旨在通过采用一些标准zipimport模块不可用的捷径,加快冻结的Python应用程序(以及假定zipfile不会更改的其他场景)的导入速度。

它导出一个有用的名称“zipimporter”,这是标准zipimporter类的替代品。要使用zipimportx替换内置的zipimport机制,请执行以下操作

import zipimportx
zipimportx.zipimporter.install()

无需额外工作,您可能已经发现从zipfile导入时速度有所提高。由于zipimportx假定zipfile不会更改或丢失,因此它比标准的zipimport实现进行的stat()调用和完整性检查要少。

为了进一步加快zipfile的加载速度,您可以通过预先计算zipimport的“目录信息”字典并将其存储在单独的索引文件中来做到这一点。这将减少从zipfile中解析信息所需的时间。创建一个像这样的索引文件

from zipimportx import zipimporter
zipimporter("mylib.zip").write_index()

这将创建一个名为“mylib.zip.idx”的文件,其中包含预先解析的zipfile目录信息。具体来说,它将包含一个与zipimport._zip_directory_cache中相同的结构的序列化字典对象。

在我的测试中,使用这些索引将Linux上的zipfile初始加载速度提高了约3倍,而在Windows上提高了5倍。

为了进一步加快模块集合的加载速度,您可以通过直接将其包含在索引中“预加载”实际模块数据。这允许在单个顺序读取中加载几个模块的数据,而不是每个模块都需要单独读取。这样预加载模块数据

from zipimportx import zipimporter
zipimporter("mylib.zip").write_index(preload=["mymod*","mypkg*"])

“preload”列表中的每个条目都是一个文件名模式。当zip文件首次被访问用于导入时,与这些模式匹配的zip文件中的文件将被预加载。您可能想从实际的zip文件中删除它们以节省空间。

最后,可以将zip文件转换为内联Python代码,并将其直接包含在您的冻结应用程序中。这可以模拟在sys.path上拥有该zip文件的效果,同时在导入过程中避免任何文件I/O。要获取必要的源代码,请执行以下操作:

from zipimportx import zipimporter
code = zipimporter("mylib.zip").get_inline_code()

最后,值得重申的是,此模块做出的一个大假设:zip文件必须始终不变且不会丢失。如果索引中的数据没有反映zip文件的实际内容,导入将可能以未指定且可能灾难性的方式中断。

请注意,此包仅使用内置模块。为了为冻结应用程序启动zip文件导入,您可以直接将此模块的代码内联到您的应用程序启动脚本中。在您的构建过程中,只需做类似以下操作:

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()

项目详情


下载文件

下载适合您的平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源代码分发

zipimportx-0.3.2.tar.gz (10.4 kB 查看哈希值)

上传时间 源代码

由以下提供支持