这个包旨在加速从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()
欢迎加入QQ群-->: 979659372
推荐PyPI第三方库