Python打包後的執行檔檔案太大?Pyinstaller與Numpy的那些事

Rick
Sep 13, 2019

--

Photo by Olena Sergienko on Unsplash

通常把寫好的Python打包成執行檔,好處除了方便前端呼叫之外,就算運行裝置沒有安裝Python也能跑,因為需要的Python套件和環境都被打包到執行檔裡面了。但也延伸出另一項問題,如果執行檔過大,運算時間會過於冗長,所以執行檔瘦身相當重要。

Numpy幾乎是Python愛好者必用的套件,打包時如果沒特別注意,很可能執行檔隨便就大於100M。

以下簡單寫一份PyinstallerDemo.py,定義一項run函數,包含引數a和回傳值b,run函數內使用numpy對a取絕對值。

接著我們開啟Anaconda Prompt 創建新的虛擬環境 PyexeNormal,作為打包環境。

conda create -n PyexeNormal python=3.5

初始環境會安裝的套件。

開啟打包環境 PyexeNormal。

activate PyexeNormal

安裝 Numpy (一般安裝Numpy的方式)。

conda install numpy

可以看到除了安裝numpy,還會多了blas和mkl的東西。不管! 眼睛閉著勇敢給它裝下去。

安裝打包套件 Pyinstaller。

pip install pyinstaller

查看打包環境 PyexeNormal 已安裝的套件。

conda list

不知道你有沒有發現,就blas套件有點不一樣,明明是用conda指令安裝,但最右側名稱不是py35,而是叫做mkl的東西。

然後把剛才寫好的PyinstallerDemo.py進行打包。

pyinstaller -F PyinstallerDemo.py

打包完成後,會出現三個資料夾與一個spec文件,執行檔放在dist裡面,可以看到執行檔居然有150M !!!...。

我們再換另外一種方式打包,重新創建新的虛擬環境PyexeForge,注意第三行多了 -c conda-forge,安裝Numpy的關聯套件也不一樣,blas不是用mkl安裝,而是openblas。

conda create -n PyexeForge python=3.5
activate PyexeForge
conda install -c conda-forge numpy
pip install pyinstaller
  • 2021更新: 若上面安裝後numpy 不是以openblas安裝,改用以下指令:
conda create -n PyexeForge python=3.5
activate PyexeForge
conda install -c conda-forge numpy blas=*=openblas
pip install pyinstaller

查看已安裝的套件,這種方式不會安裝到mkl套件。

打包後執行檔只有10M !!!,相差15倍阿....。

--

--

Rick

理解、分解、再構成,我是說鍊金術