为冻结的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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb54b51f4ee90ebf83c8f35314f1b05e5c486d2691d4dc1322d4e89594eb37e9 |
|
MD5 | 84d554f0dc101c4ad9aece89be2e414f |
|
BLAKE2b-256 | 62634bac500589eb5d0febcbb708007665230b2261bbdf80a738acfbaf81ba17 |