使用PyInstaller创建的应用程序启动缓慢

EB.*_*EB. 32 python windows performance pyinstaller

我有一个用Python编写的应用程序,并使用PyInstaller进行"编译".它还使用PyQt作为GUI框架.

在主窗口加载并显示之前,运行此应用程序会有大约10秒的延迟.据我所知,这不是因为我的代码缓慢.相反,我怀疑这是由于Python运行时初始化.

问题是该应用程序是使用自定义的laucncher /任务栏应用程序启动的.用户将单击按钮以启动应用程序,看不到任何内容,并单击其他应用程序上的其他位置.当我的应用程序显示它的窗口时,由于SetForegroundWindow的规则,它无法到达前台.

我可以访问PyInstaller win32加载器,Python代码甚至启动器代码的源代码.

我的问题是:

  • 如何让这个应用程序更快启动?

  • 如何衡量流程生命周期的前几秒花费的时间?

  • 在第一个窗口显示之前减少时间的普遍接受的技术是什么?

我想避免添加启动画面有两个原因 - 一个,我希望它不会有帮助(开销是在Python代码运行之前)和两个,我只是不喜欢启动画面:)

如果我需要,我可能编辑PyInstaller加载器存根来创建一个窗口,但这是另一条我不想采取的路径.

Gio*_*ajo 23

告诉PyInstaller创建一个控制台模式的可执行文件.这为您提供了一个可用于调试的工作控制台.

在主脚本的顶部,甚至在第一次导入之前,添加一个打印"Python Code starting".然后从命令行运行打包的可执行文件.通过这种方式,您可以清楚地了解PyInstaller的引导加载程序或应用程序中的时间.

PyInstaller的引导加载程序在单目录模式下通常非常快,但在单文件模式下它可能会慢很多,因为它将所有内容都卸载到一个临时目录中.在Windows上,I/O非常慢,然后你有防病毒软件需要仔细检查所有这些DLL文件.

PyQt本身不是问题.PyQt由SIP生成,它生成非常快速的延迟绑定; 导入整个PyQt比任何其他GUI库都要快,因为它基本上什么也不做:所有对类/函数的绑定都是在你访问它们时(以及如果!)动态创建的,也节省了大量内存.

如果您的应用程序出现缓慢,那么没有PyInstaller也是如此.在这种情况下,您唯一的解决方案是启动屏幕(只导入PyQt,创建QApplication,创建显示启动画面,然后导入程序的其余部分并运行它),或者重新编写代码.没有细节,我帮不了你.

  • 你是对的,我创建了一个更简单的应用程序,实际上启动时间几乎是即时的。我正在使用 onedir 模式。我相信问题出在我的几个进口上。我还有很多追踪工作要做。 (3认同)
  • 哇,谢谢你的杀毒技巧。一旦我禁用了AV,我的exe就会加速运行。 (2认同)

Shi*_*ish 18

我怀疑你正在使用pyinstaller的"一个文件"模式 - 这种模式意味着它必须在应用程序启动之前将所有库解压缩到一个临时目录.在Qt的情况下,这些库非常大并且需要几秒钟来解压缩.尝试使用"一个目录"模式,看看是否有帮助?


Rus*_*ssj 12

我同意上面的答案。使用 onefile 模式时,我的 Qt python 程序需要大约 5 秒才能在体面的 PC 上启动。改成--onedir后,启动只用了一秒左右;用户双击 exe 文件后几乎立即。但缺点是那个目录下有很多文件,不是那么整齐。


Not*_*ser 0

我使用 py2exe 和 cx_Freeze“编译”了一些 wxPython 应用程序,它们的启动时间都不超过 4 秒。

  • 您确定这不是您的代码吗?也许某些网络或某些 I/O 资源调用保存了您的应用程序?
  • 您是否尝试过除您的机器之外的其他机器?即使是最快的硬件有时也会因为错误的软件配置、应用程序或操作系统而变慢,请尝试一下。
  • 尝试使用 timeit 模块进行计时。

我没用过pyQT,但是用wxPython启动速度还可以,第一次初始化后如果关闭再打开,比第一次要快。

  • 缓慢的是在执行任何代码之前将 .exe 及其所有依赖项和库解压到临时 (`_MEIxxxx`) 文件夹。即使是 `print("Hello world!")` 也需要 10 秒才能加载。 (13认同)