关于python:使用PyInstaller创建的应用启动缓慢

App created with PyInstaller has a slow startup

我有一个用Python编写的应用程序,并使用PyInstaller"编译"了。它还将PyQt用于GUI框架。

运行此应用程序会延迟大约10秒钟,然后才会显示主窗口。据我所知,这不是由于我的代码慢。相反,我怀疑这是由于Python运行时初始化引起的。

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

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

我的问题是:

  • 如何使该应用程序启动更快?

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

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

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

如果需要,我可以编辑PyInstaller加载程序Stubbing以创建一个窗口,但这是我不愿意采用的另一种方法。


我怀疑您使用的是pyinstaller的"一个文件"模式-此模式意味着必须先将所有库解压缩到一个临时目录,然后才能启动该应用程序。对于Qt,这些库很大,需要花费几秒钟的时间进行解压缩。尝试使用"一个目录"模式,看看是否有帮助?


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

在主脚本的顶部,即使在第一次导入运行之前,也要添加打印" Python代码开始"。然后从命令行运行打包的可执行文件。这样,您就可以清楚地了解时间是花费在PyInstaller的引导加载程序中还是应用程序中。

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

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

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


我同意以上答案。使用onefile模式时,我的Qt python程序需要大约5秒钟才能在像样的PC上启动。在我更改为--onedir后,仅花费了大约一秒钟的时间即可开始;用户双击exe文件后几乎立即执行。但是缺点是该目录中有很多文件不是??那么整洁。


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

为了使这些度量更清晰:我的应用程序捆绑了额外的数据文件(大约150个文件,有效载荷为250MB),除了随身携带Qt和numpy(可能取决于Intel MKL,仅此一项就向其中添加了200MB)捆绑!)依赖项。被测系统正在使用固态驱动器运行甚至没有多大帮助...

结论:如果您的大型应用程序具有很多依赖性,则启动时间可能会受到防病毒系统的强烈影响!


万一仍然有人遇到此问题,我通过在本地而不是任何共享驱动器上运行exe来解决了我的问题。这将启动时间从一分钟以上缩短到了10秒以下。


我已经使用py2exe和cx_Freeze对一些wxPython应用程序进行了"编译",它们中的任何一个都不会花费超过4秒钟的时间来启动。

  • 您确定不是您的代码吗?
    也许有一些网络或一些I / O资源呼叫正在占用您的应用程序?
  • 您是否尝试过其他机器?有时即使使用错误的软件配置,应用程序或操作系统,即使是最快的硬件也可能会变慢,请尝试一下。
  • 尝试使用timeit模块对其计时。

我从未使用过pyQT,但是使用wxPython时,启动速度还可以,并且在第一次初始化后,如果我再次关闭并再次打开,它的速度将比第一次快。