py2exeで生成するexeを軽量化する方法

py2exeを使えば簡単にexeファイルを生成することができますが、どうしても生成されたexeファイルと依存関係のあるファイルを合わせるとかなり大きなサイズになってしまいます。

この記事では、Pythonのプログラムをexeファイルに変換する際に、生成されるexeファイルのサイズを軽量化する方法について解説します。

目次から探す

不要なモジュールの除外

Pythonのプログラムをexeファイルに変換する際、不要なモジュールを除外することで生成されるexeファイルのサイズを軽量化することができます。

ここでは、使用していないモジュールを特定する方法と、不要なモジュールを除外する方法について解説します。

使用していないモジュールの特定方法

使用していないモジュールを特定するためには、Pythonのモジュール解析ツールを使用することができます。

例えば、pylintpyflakesといったツールを使うことで、プログラム内で使用されていないモジュールを検出することができます。

以下は、pylintを使用して使用していないモジュールを特定する例です。

pylint your_script.py

your_script.pyには、対象のPythonスクリプトのファイル名を指定します。

pylintはコードを解析し、使用されていないモジュールを警告やエラーとして表示します。

以下は、実際にpylintを使用して使用して、未使用のモジュールを特定する例です。

# 使わないモジュールをわざとimportしてみる
import os
import sys

print(3 + 5)
$ pylint .\sample.py
************* Module sample
sample.py:1:0: C0114: Missing module docstring (missing-module-docstring)
sample.py:1:0: W0611: Unused import os (unused-import)
sample.py:2:0: W0611: Unused import sys (unused-import)

------------------------------------------------------------------
Your code has been rated at 0.00/10 (previous run: 0.00/10, +0.00)

解析結果を見てみると、sample.py:1:0: W0611: Unused import os (unused-import)sample.py:1:0: W0611: Unused import os (unused-import)の2つが発生し、osモジュールとsysモジュールを使っていないことを確認できます。

今回は、小規模なプログラムなのでわざわざpylintを使わなくても特定できますが、数十から数百ファイルにわたる大規模なプロジェクトだと、pylintを使って未使用のモジュールを特定する手法はかなり役立ちます。

不要なモジュールの除外方法

不要なモジュールを除外するためには、py2exeの設定ファイルであるsetup.pyを編集する必要があります。

以下のようなコードをsetup.pyに追加することで、不要なモジュールを除外することができます。

from distutils.core import setup
import py2exe
setup(
    # ここに設定情報を記述
    options={
        "py2exe": {
            "exclude": ["module1", "module2"]
        }
    },
    # 以下省略
)

上記の例では、module1module2というモジュールを除外しています。

実際の設定では、除外したいモジュールの名前をリストで指定します。

以上が、不要なモジュールを除外するための方法です。

当然ですが、使用しているモジュールを除外してしまうとエラーになってしまうので注意しましょう。

不要なモジュールを特定し、py2exeの設定ファイルで除外することで、生成されるexeファイルのサイズを軽量化することができます。

冗長なコードの削除

プログラムを効率的に実行するためには、冗長なコードを削除することが重要です。

冗長なコードは、プログラムの実行時間を長くし、メモリの使用量を増やす原因となるほか、exeファイルのファイルサイズにも多少影響します。

以下では、コードの最適化方法と不要なコードの削除方法について説明します。

コードの最適化方法

コードの最適化は、プログラムの実行速度を向上させるために行われます。

以下に、いくつかのコードの最適化方法を紹介します。

ループの最適化

ループ処理はプログラムの実行時間に大きな影響を与えることがあります。

ループ内で不要な処理を行っていないか、ループの回数を減らすことができないかを検討しましょう。

変数の最適化

変数の使用方法によってもプログラムの実行速度が変わることがあります。

不要な変数の使用を避け、変数のスコープを適切に設定することで、メモリの使用量を減らすことができます。

ライブラリの最適化

使用しているライブラリが最新版であるか、最適化されているかを確認しましょう。

最新版のライブラリは、バグ修正やパフォーマンスの向上が行われていることがあります。

不要なコードの削除方法

不要なコードは、プログラムの実行結果に影響を与えず、かつ理解しやすいコードを書くために削除する必要があります。

以下に、不要なコードの削除方法を紹介します。

未使用の変数や関数の削除

プログラム内で使用されていない変数や関数は、削除することでコードの見通しを良くすることができます。

コメントアウトされたコードの削除

コメントアウトされたコードは、実行されないため不要です。

コメントアウトされたコードを削除することで、コードの見やすさを向上させることができるので、残す必要がなくなったコメントアウトされたコードがある場合は削除するといいでしょう。

冗長な条件分岐の削除

同じ結果を返す条件分岐が複数存在する場合、冗長な条件分岐を削除することでコードの簡潔さを保つことができます。

以上が、コードの最適化方法と不要なコードの削除方法の一部です。

プログラムを効率的に実行するためには、これらの方法を活用してコードを見直し、冗長な部分を削除することが重要です。

コンパイルオプションの最適化

Pythonのコンパイルオプションを最適化することで、生成されるexeファイルのサイズを削減することができます。

以下に、いくつかの最適化方法を紹介します。

1. コンパイルフラグの設定

py2exeでは、setup.pyファイル内でコンパイルフラグを設定することができます。

例えば、以下のようにoptimizeフラグを設定することで、コードの最適化を行うことができます。

from distutils.core import setup
import py2exe
setup(
    options = {'py2exe': {'optimize': 2}},
    windows = [{'script': 'main.py'}],
    zipfile = None
)

optimizeフラグには、0から2までの値を指定することができます。

0は最適化を行わず、2は最も強力な最適化を行います。

ただし、最適化の度合いが高いほど、実行速度が低下する可能性もあるため、適切な値を選ぶ必要があります。

ファイルの圧縮方法の変更

py2exeで生成されるexeファイルは、デフォルトではzip形式で圧縮されます。

しかし、zip形式は圧縮率が高い反面、展開に時間がかかるというデメリットがあります。

そのため、exeファイルのサイズを減らすためには、圧縮方法を変更することが有効です。

py2exeでは、圧縮方法を変更するためのオプションが用意されています。

以下に、圧縮方法を変更する方法を示します。

from distutils.core import setup
import py2exe
setup(
    options = {'py2exe': {'compressed': 1, 'optimize': 2, 'bundle_files': 1}},
    windows = [{'script': 'main.py'}],
    zipfile = None
)

上記のコードでは、compressedオプションを1に設定することで、圧縮方法を変更しています。

また、optimizeオプションを2に設定することで、最適化レベルを上げることもできます。

さらに、bundle_filesオプションを1に設定することで、すべてのファイルを1つのexeファイルにバンドルすることも可能です。

一部まとめられないDLLファイルは別で出力されます。

これらのオプションを設定することで、exeファイルのサイズを減らすことができます。

ただし、圧縮方法を変更することで、実行速度が若干低下する可能性もあるため、注意が必要です。

以上が、py2exeを使用して生成されるexeファイルの圧縮方法を変更する方法です。

適切な圧縮方法を選択することで、exeファイルのサイズを最適化し、効率的な配布が可能となります。

目次から探す