2012-02-27 144 views
18

我有一个用Python编写的应用程序,用PyInstaller'编译'。它还使用PyQt作为GUI框架。Windows:缓慢启动应用程序

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

问题是,此应用程序是由自定义laucncher /任务栏应用程序启动的。用户将点击按钮启动应用程序,看不到任何事情发生,并在另一个应用程序的其他地方点击。当我的应用程序显示它是窗口时,由于SetForegroundWindow的规则,它不能到达前台。

我有权访问PyInstaller win32加载器,Python代码甚至是启动器代码。

我的问题是:

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

  • 我该如何衡量过程一生中头几秒的时间花费?

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

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

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

感谢您的建议。

回答

1

我使用py2exe和cx_Freeze'编译'了几个wxPython应用程序,它们都不需要超过4秒的时间就可以启动。

  • 你确定这不是你的代码吗? 可能是一些网络或一些I/O资源调用来保存你的应用程序?
  • 你试过其他机器吗?即使是速度最快的硬件,有时候使用错误的软件配置,应用程序或操作系统也会变慢,请尝试。
  • 尝试使用timeit模块进行计时。

我从来没有使用pyQT,但用wxPython的启动速度是OK,并且在第一次初始化后,如果我关闭并再次打开,它比第一次更快。

8

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

10

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

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

PyInstaller的bootloader通常在one-dir模式下运行速度非常快,但在单文件模式下它可能会慢很多,因为它会将所有内容都解压到临时目录中。在Windows上,I/O速度非常慢,然后您有防病毒软件需要仔细检查所有这些DLL文件。

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

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

+0

你说得对,我创建了一个更简单的应用程序,启动时间几乎是瞬间完成的。我正在使用onedir模式。我相信问题是我的几个进口。我有更多的跟踪要做。 – 2012-02-28 20:28:00

+0

哇,感谢您的防病毒技巧。一旦我禁用了我的AV,我的exe就加快了。 – iridescent 2016-05-23 15:06:18

1

我同意上面的答案。使用单文件模式时,我的Qt python程序需要大约5秒才能在体面PC上启动。在我换成--onedir之后,它只需要大约一秒的时间才能开始;几乎在用户双击exe文件后立即生效。但缺点是该目录中有许多文件不够整齐。