You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuitka打包PySide6独立应用启动过慢问题求助

问题

我开发了一个依赖NumPy、SciPy、MatPlotLib、Pickle等库的PySide6 GUI应用,在Python环境中运行无性能问题,但使用Nuitka打包为Mac平台独立应用后,启动时间极长(超过1分钟),启动后运行正常。

使用的打包命令

python3 -m nuitka \
    --standalone \
    --macos-create-app-bundle \
    --enable-plugin=pyside6 \
    --include-qt-plugins=sensible,qmacstyle,platforms \
    --include-data-files=logo.png=logo.png \
    --include-data-files=logo.icns=logo.icns \
    --include-module=nifco \
    --include-module=libminpack \
    --include-package=antoineCalc \
    --include-package=orgProps \
    --include-package=dict2struct \
    --include-package=stripVLE \
    --include-package=RCM \
    --include-package=RCMplot \
    --macos-app-icon=logo.icns \
    --output-dir=dist \
    --macos-app-name=freeRCM \
    freeRCM.py

主应用导入代码

import sys
import os
import numpy as np
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QPushButton, QVBoxLayout,
                               QHBoxLayout,QLabel, QListWidget, QLineEdit, QComboBox, QFrame,
                               QTableWidget, QTableWidgetItem, QFileDialog, QMessageBox,
                               QInputDialog, QGridLayout, QSizePolicy, QSpacerItem)
from PySide6.QtCore import Qt, QSize
from PySide6.QtGui import QPixmap
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qtagg import NavigationToolbar2QT as NavigationToolbar
import pickle
from dict2struct import dict2struct
from RCM import RCM
from RCMplot import RCMplot

打包过程中会包含matplotlib.bezier、matplotlib.contour、scipy.interpolate等未使用的模块,虽推测后续阶段会清理,但仍希望了解减少冗余的最佳方法(当前打包后体积约300MB),或其他缩短启动时间的方案。


缩短启动时间的方案

  • 启用快速启动模式:给打包命令添加--fast-start参数,该参数会延迟加载非必要模块,仅在实际调用时才完成初始化,能大幅降低启动阶段的加载开销。
  • 延迟导入非核心模块:将非启动必需的导入(如Matplotlib相关组件、SciPy未用到的子模块)从文件顶部全局导入,移到具体使用它们的函数内部,避免启动时一次性加载所有依赖。
  • 精简Qt插件范围:当前--include-qt-plugins指定的sensible,qmacstyle,platforms可进一步缩小,仅保留实际用到的平台插件(如platforms/libqcocoa.dylib),排除多余插件的加载。
  • 锁定Matplotlib后端:通过--exclude-module=matplotlib.backends.backend_*排除所有未使用的后端,再用--include-module=matplotlib.backends.backend_qtagg明确保留需要的Qt后端,减少不必要的模块初始化。

减少打包体积的方法

  • 排除未使用的模块/包:针对明确未用到的模块(如matplotlib.bezier、scipy.interpolate),直接用--exclude-module=模块名参数排除;对于整个未使用的子包,使用--exclude-package=包名。
  • 启用编译优化与压缩:添加--lto=yes开启链接时优化,减少可执行文件体积;或使用--macos-app-store-safe启用App Bundle压缩。
  • 清理冗余数据文件:通过--exclude-data-files参数排除未用到的Matplotlib数据(如多余字体、示例数据),例如--exclude-data-files=matplotlib/data/**/*.ttf,若仅需特定字体,可改用--include-data-files明确指定。
  • 精简SciPy/NumPy依赖:如果仅用到SciPy的部分功能,用--exclude-package=scipy.optimize这类参数排除未使用的子包,只保留实际需要的组件。
  • 使用干净的虚拟环境:在仅安装应用必需依赖的虚拟环境中打包,避免混入系统Python中多余的库文件。

内容的提问来源于stack exchange,提问作者user26845598

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:15:21