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

ev7lccsx  于 2021-08-20  发布在  Java
关注(0)|答案(6)|浏览(1127)

我有一个用python编写的应用程序,并用pyinstaller“编译”。它还将pyqt用于gui框架。
在主窗口加载和显示之前,运行此应用程序有大约10秒的延迟。据我所知,这并不是因为我的代码太慢。相反,我怀疑这是由于python运行时初始化造成的。
问题在于,此应用程序是使用自定义laucncher/taskbar应用程序启动的。用户将单击按钮启动应用程序,看到没有发生任何事情,然后单击其他应用程序上的其他位置。当我的应用程序显示它的窗口时,由于setforegroundwindow的规则,它不能出现在前台。
我可以访问pyinstaller win32 loader的源代码、python代码甚至启动器代码。
我的问题是:
如何使此应用程序启动更快?
我如何衡量流程生命周期的前几秒所花费的时间?
在显示第一个窗口之前,缩短时间的公认技术是什么?
我希望避免添加初始屏幕,原因有二:一是我希望它不会有帮助(开销在python代码运行之前),二是我不喜欢初始屏幕:)
如果需要,我可能会编辑pyinstaller加载程序存根来创建一个窗口,但这是我不愿意采用的另一种方法。

mbyulnm0

mbyulnm01#

我已经使用py2exe和cx_freeze“编译”了一些wxpython应用程序,它们启动的时间都不超过4秒。
你确定这不是你的代码吗?可能是某个网络或某个i/o资源呼叫占用了您的应用程序?
除了你的机器,你还试过别的机器吗?即使是最快的硬件,有时也会因为错误的软件配置、应用程序或操作系统而变慢,试试吧。
尝试使用timeit模块计时。
我从未使用过pyqt,但使用wxpython时,启动速度还可以,在第一次初始化之后,如果我再次关闭和打开,启动速度会比第一次快。

hgb9j2n6

hgb9j2n62#

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

mv1qrgav

mv1qrgav3#

告诉pyinstaller创建控制台模式可执行文件。这为您提供了一个可用于调试的工作控制台。
在主脚本的顶部,甚至在第一次导入运行之前,添加一个打印“python代码开始”。然后从命令行运行打包的可执行文件。通过这种方式,您可以清楚地了解时间是花在pyinstaller的引导加载程序中还是花在应用程序中。
pyinstaller的引导加载程序在单目录模式下通常非常快,但在单文件模式下可能慢得多,因为它会将所有内容解压缩到一个临时目录中。在windows上,i/o速度非常慢,然后您会有一些用户希望仔细检查所有这些dll文件。
pyqt本身不是问题。pyqt由sip生成,sip生成非常快的惰性绑定;导入整个pyqt比任何其他gui库都要快,因为它基本上什么都不做:所有类/函数的绑定都是在(如果!)您可以访问它们,也可以节省大量内存。
如果您的应用程序运行缓慢,那么在没有pyinstaller的情况下也是如此。在这种情况下,您唯一的解决方案是启动屏幕(仅导入pyqt、创建qapplication、创建一个显示启动屏幕的应用程序,然后导入程序的其余部分并运行它),或者重新编写代码。没有细节我帮不了你多少忙。

pbpqsu0x

pbpqsu0x4#

我同意上述答案。当使用onefile模式时,我的qt python程序需要大约5秒钟才能在一台像样的pc上启动。在我切换到--onedir之后,只花了大约一秒钟就开始了;几乎在用户双击exe文件后立即。但缺点是,该目录中有许多文件不太整洁。

v9tzhpje

v9tzhpje5#

对于我的应用程序,启动时间长几乎完全是由防病毒系统造成的。在我的情况下,关闭它会将启动时间从3分钟缩短到10秒以下!
为了更好地了解这些测量结果:我的应用程序捆绑了额外的数据文件(约150个文件,有效负载为250mb),此外还附带了qt和numpy(这可能取决于intel mkl,仅此一项就为捆绑包增加了200mb!)依赖关系。测试系统运行的是固态驱动器,这甚至没有多大帮助。。。
总之:如果您有一个具有大量依赖项的大型应用程序,那么防病毒系统可能会严重影响启动时间!

3ks5zfa0

3ks5zfa06#

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

相关问题