为冻结的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()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在从servlet内调用外部站点时获取HTTP 406   java我们可以将字符串转换为函数名并调用该函数吗?   javajavax。命名。InitialContext是一个受限类。有关更多详细信息,请参阅谷歌应用程序引擎开发者指南   运行allure命令行generate命令时发生java错误   java将多个非数字字符替换为1个非数字字符   java Flink ElasticSearchSink函数在非静态方法中不可序列化,但在静态方法中可序列化   java mavencompilerplugin:3.7.0:Spring工具套件中的编译(defaultcompile)   onConsoleMessage捕获的java控制台消息不完整   阅读自己的清单。Java servlet中的MF   javaservlet+JSP。解释为样式表但使用MIME类型text/plain传输的资源   java从servlet提供音频(mp3)文件   netbeans在java中编译和运行。给我错误   java正在对地图进行重新排序   Java War文件不会在Eclipse中使用WildFly进行更新   如何在JavaSWT中清除窗口历史记录?   java场景不适合舞台   java如何使用Maps GWT API显示多个信息窗口?   java将字符串属性映射到JSONB   java为什么数组常量只能在初始值设定项中使用?   java有没有办法让@SpringBootTest类递归?