3.1 KiB
3.1 KiB
启动速度优化指南
问题
PyInstaller 单文件打包后启动时间超过 30 秒,太慢。
优化措施
1. 代码层面优化(已实现)
延迟导入大型模块
- QWebEngineView:只在创建 WebItem 时导入
- InfluxDBClient:只在进入展示模式时创建
# 之前:启动时立即导入
from PyQt6.QtWebEngineWidgets import QWebEngineView
from influxdb_wrapper import InfluxDBClient
# 现在:延迟导入
# 在 WebItem.__init__ 中:
from PyQt6.QtWebEngineWidgets import QWebEngineView
# 在需要 Influx 时:
if self.influx_client is None:
from influxdb_wrapper import InfluxDBClient
self.influx_client = InfluxDBClient(self)
2. 打包参数优化
使用优化版打包脚本
python build_optimized.py
关键优化参数
--noupx:不使用 UPX 压缩(UPX 会增加解压时间)--optimize=2:Python 字节码优化级别--exclude-module:排除不需要的大型模块- 不收集全部 PyQt6(只收集必要的)
3. 进一步优化建议
A. 使用 --onedir 模式(推荐)
单文件模式需要解压所有文件到临时目录,这很慢。如果启动速度是优先考虑,建议使用文件夹模式:
python build_optimized.py --onedir
优点:
- 启动速度快(不需要解压)
- 文件体积更小
- 更新时只需替换 exe 文件
缺点:
- 需要整个文件夹一起分发
B. 减少启动时的初始化工作
- 延迟加载布局文件(在后台线程)
- 延迟创建非关键 UI 组件
- 使用启动画面(让用户知道程序正在加载)
C. 使用 Nuitka 替代 PyInstaller(可选)
Nuitka 将 Python 编译为 C++,启动速度通常更快:
pip install nuitka
python -m nuitka --onefile --windows-disable-console main.py
D. 使用 SSD 和快速 CPU
- 单文件模式需要解压到临时目录,SSD 会快很多
- CPU 性能也影响解压速度
4. 性能对比
| 方案 | 启动时间 | 文件大小 | 分发便利性 |
|---|---|---|---|
| 单文件(优化前) | 30+ 秒 | ~200MB | ⭐⭐⭐⭐⭐ |
| 单文件(优化后) | 10-15 秒 | ~180MB | ⭐⭐⭐⭐⭐ |
| 文件夹模式 | 2-5 秒 | ~200MB | ⭐⭐⭐ |
| Nuitka 单文件 | 5-10 秒 | ~150MB | ⭐⭐⭐⭐⭐ |
5. 测试启动时间
打包后测试启动时间:
# Windows
timeout /t 0 /nobreak >nul & dist\PCM_Viewer.exe
# 或使用 PowerShell
Measure-Command { Start-Process -FilePath "dist\PCM_Viewer.exe" -Wait }
6. 如果仍然太慢
如果优化后仍然超过 10 秒,强烈建议:
-
使用文件夹模式(
--onedir)- 启动速度通常快 5-10 倍
- 只需分发整个文件夹
-
考虑使用 Nuitka
- 编译为原生代码,启动更快
- 但打包时间更长
-
检查杀毒软件
- 某些杀毒软件会扫描单文件 exe,导致启动慢
- 可以添加到白名单
-
使用启动画面
- 即使启动慢,至少让用户知道程序在加载
- 可以显示进度条或加载动画