PyInstaller より圧倒的に優れている Nuitka の使い方とハマった

基礎知識は下記。

はじめにexe化とはなにか紹介します。

①exe化のメリット

exe化には何点かメリットがあります。特にメリットの大きい3点を確認してみましょう。

  1. PythonをインストールしていないPCでも実行できる

  2. ターミナルやシェルからでなく、ダブルクリック等で実行できる

  3. アイコンを設定できる。





大晦日ギリギリに何の記事を書いてるんだ?となりそうですが、皆さんは PyInstaller で Python で作ったソフトを exe 化したい!と思った事はありますか? 私は何度かあります。

ですが、PyInstaller で作ったソフトは ファイルサイズがデカい・起動が遅い・ウイルス判定されやすい とちょっと微妙な点が多いです。
それでも比較的簡単に exe 化できるのでよく使われているわけですが、とはいえネイティブの exe ほどパフォーマンスは上がりませんし、むしろ普通に Python で実行したときより遅くなります。

ここで、PyInstaller の仕組みを簡潔に説明します。
PyInstaller は基本 --onefile オプションをつけて実行することが多いと思いますが、あれは exe の中に自己解凍機能が入っていて、実行すると Windows なら AppData\Local\Temp あたりに exe の中に入っていたパッケージ一式が解凍されます。その中に入っているスクリプトを実行することで、見た感じあたかも単一の exe ファイルで実行できるように見せかけている、というものです。
解凍されたパッケージ一式は終了時に削除されるため、ダブルクリックで実行した際にそうしたパッケージを毎回解凍することになり、それが起動時のオーバーヘッドになっています。

ほかに Python を exe 化するソフトとしてはたとえば py2exe という Windows 専用のツールなどもあったりしますが、Windows 専用な上に使い方が面倒くさく、あまり手軽とはいえません。

続きは以下のソースで!







とあるデスクトップアプリをKivy/Pythonで作ってみたときに、NuitkaでWindows用にexeファイル化をしまして、その時の試行錯誤の記録です。

最初はPyInstallerでexe化しようとしていたのですが、PyInstallerでone-fileモードでexe化すると起動に

135秒かかる。

で、ファイル容量が

393 MBになってしまう、と。

おおぅ( ̄□ ̄;)!!!

一方、one-fileモードでなくて、one-directoryモードであれば15秒ほどで起動できるのですが、directoryのファイル容量が、、、

700 MB超え。

いやぁん( ̄□ ̄;)!!!

こりゃイカンということで、起動時間とファイル容量の改善が期待できると耳にしたNuitkaを使ってみることにしました。

んが、初めてのワタシがやってすんなりいくはずもなく、試行錯誤が必要でした。

なので今後のために記録を残しておきます。

というか書きなぐります。

結果としては、起動時間を6.6秒に、exeファイル容量を82 MBに改善することができました。

記事の後半にNuitkaでexe化したときと、PyInstallerでexe化したときの結果の簡単な比較表を載せてみましたよ。

実施環境

PC、OSなど

MacBook 2017 (Intel Core m3, 1.2 GHz, RAM 8GB)(Boot CampでWindowsを導入)

Windows10 Home 21H2

PowerShell version; 5.1.19041.1682

MSVC コンパイラ(cl; 14.3 )(Build Tools for Visual Studio 2022より)

Python、pyenv、pipenv、NuitkaとPyInstaller

pyenvを使って、pipenvでの仮想環境下で実施しています。

Python 3.9.12

pyenv; 2.64.11

pipenv; version 2022.4.21

Nuitka; 0.8.1

PyInstaller; 5.1

今回exe化に供したファイル

pyファイル:253 KB

これに付随して必要なkv, csv, png, ico, ttf, xmlファイルを少々(合計6.5 MB)


pyファイルでimportしている主なライブラリ

numpy; 1.22.4

pandas; 1.2.4

scipy; 1.7.3

kivy; 2.1.0

plotly; 5.8.0

ソースは以下



pic ref



この記事が気に入ったらサポートをしてみませんか?