66

我有一个用 Python 编写并使用 PyInstaller“编译”的应用程序。它还使用 PyQt 作为 GUI 框架。

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

问题是这个应用程序是使用自定义启动器/任务栏应用程序启动的。用户将单击按钮以启动应用程序,看到没有任何反应,然后单击另一个应用程序的其他位置。当我的应用程序显示它的窗口时,由于 SetForegroundWindow 的规则,它无法进入前台。

我可以访问 PyInstaller win32 加载程序、Python 代码甚至启动器代码的源代码。

我的问题是:

  • 我怎样才能让这个应用程序启动得更快?

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

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

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

如果需要,我可能会编辑 PyInstaller 加载程序存根以创建一个窗口,但这是我不想采取的另一条路线。

4

7 回答 7

62

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

于 2012-02-27T18:42:00.773 回答
41

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

在主脚本的顶部,甚至在第一次导入运行之前,添加打印“Python 代码开始”。然后从命令行运行打包的可执行文件。通过这种方式,您可以清楚地了解时间是花在 PyInstaller 的引导加载程序中还是在您的应用程序中。

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

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

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

于 2012-02-28T00:25:58.893 回答
11

我同意上述答案。使用 onefile 模式时,我的 Qt python 程序需要大约 5 秒才能在一台不错的 PC 上启动。在我更改为 --onedir 后,启动只需要大约一秒钟;在用户双击 exe 文件后几乎立即。但缺点是该目录中有很多文件,不是那么整洁。

于 2013-04-09T02:14:06.143 回答
2

如果有人仍然有这个问题,我通过在本地而不是在任何共享驱动器上运行 exe 来解决我的问题。这使启动时间从一分钟多到不到 10 秒。

于 2019-08-05T21:27:38.477 回答
2

对于我的应用程序,长时间的启动几乎完全是由防病毒系统引起的。关闭它可以将我的启动时间从 3 分钟缩短到不到 10 秒!

为了使这些测量结果更直观:我的应用程序捆绑了额外的数据文件(大约 150 个文件,有效负载为 250MB),此外还携带 Qt 和 numpy(这可能取决于英特尔 MKL,仅此一项就增加了 200MB 到捆绑包中!)依赖关系。测试系统使用固态驱动器运行甚至没有太大帮助......

总结:如果你的应用程序很大,依赖很多,启动时间可能会受到防病毒系统的强烈影响!

于 2018-03-18T17:01:20.337 回答
1

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

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

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

于 2012-02-27T18:37:32.630 回答
0

我通过在防病毒监控软件 ( F-Secure) 中添加一个例外解决了这个问题。它消除了运行前几分钟的等待。

于 2021-08-12T15:19:41.927 回答