Skip to content

Python の pycache を理解する:知っておくべきすべてのこと

Updated on

Python スクリプトを実行したとき、プロジェクト内に __pycache__ というフォルダが現れているのに気づいたことがあるかもしれません。一見重要ではなさそうに見えますが、これは Python がプログラムを効率よく実行するうえで重要な役割を果たしています。本ガイドでは、__pycache__ フォルダとは何か、なぜ Python がそれを生成するのか、そしてどのように安全に管理・削除できるのかを解説します。

Python はインタプリタ言語ですが、毎回すべての .py ファイルを一から解釈しているわけではありません。代わりに、ソースコードを バイトコード と呼ばれる軽量で低レベルな表現にコンパイルし、それを高速に実行します。こうしてコンパイルされたバイトコードファイル(拡張子 .pyc)が __pycache__ フォルダ内に保存されます。

Python Pandas Dataframe からコード不要で素早くデータ可視化を行いたいですか?

PyGWalker は、可視化による Exploratory Data Analysis を行うための Python ライブラリです。
PyGWalker (opens in a new tab) は、pandas や polars の dataframe を、Jupyter Notebook 上で直接 Tableau ライクなインターフェースに変換します。

PyGWalker for Data visualization (opens in a new tab)


Python における pycache とは?

__pycache__ フォルダは、Python がモジュールを実行したときに自動的に作成されます。この中に、.py ファイルをコンパイルしたバイトコード版である .pyc ファイルが保存されます。

バイトコードは、実行を高速化するために設計されています。スクリプトを実行するとき、Python は最新の .pyc ファイルを探します。

  • もし存在し、現在のソースコードと一致していれば → Python は .pyc ファイルをすぐに読み込みます。
  • そうでなければ → Python はソースコードを再コンパイルし、新しい .pyc ファイルを生成して __pycache__ に保存します。

ファイル名が module.cpython-310.pyc のようになっている理由

最近の Python では、インタプリタのタグ(例:cpython-311)をファイル名に含めることで、複数バージョンの Python を衝突なく共存させられるようになっています。

これは特に次のようなケースで重要です。

  • 仮想環境を使う場合
  • システムの Python と、環境ごとに異なる Python を併用している場合
  • pyenv、conda、Docker イメージなどのツールを利用している場合

pycache フォルダはどこに作成される?

__pycache__ フォルダは、実行される Python モジュールと同じディレクトリ 内に作成されます。

ディレクトリ構造の例:

my_project/
  main.py
  utils.py
  __pycache__/
    main.cpython-311.pyc
    utils.cpython-311.pyc

別のディレクトリからモジュールを import した場合、そのディレクトリにも独自の __pycache__ が生成されます。

仮想環境の場合

仮想環境内では、インストールされたパッケージの中に多くの __pycache__ フォルダが含まれていることがあります。これは正常な挙動で、パッケージが初めて import されたときに .pyc ファイルが生成されるためです。


pycache はどのように Python スクリプトを高速化する?

通常、Python スクリプトの実行には次のステップが必要です。

  1. テキスト(ソースコード)の解析
  2. 抽象構文木(AST)の構築
  3. AST をバイトコードへコンパイル
  4. バイトコードの実行

Python が最新版の .pyc ファイルを見つけられる場合、ステップ 1〜3 をスキップできます。そのため、

  • 最初の実行はわずかに遅い場合がある
  • 2 回目以降の実行は(特に大規模なコードベースでは)速くなる

という挙動になります。

ハッシュベースの pyc ファイル(PEP 552)

最近の Python では、次の 2 種類の .pyc ファイル方式がサポートされています。

  • タイムスタンプベースの .pyc(デフォルト)
  • ハッシュベースの .pyc(再現性のあるビルド、パッケージング、Docker イメージ向け)

これにより、自動化された環境やコンテナ環境において、バイトコード生成の安定性が向上します。


pycache フォルダは削除してもよい?

はい、__pycache__ は削除しても問題ありません。

スクリプトを次に実行したときに、Python が自動的に再作成します。唯一のデメリットは、再コンパイルが必要になるため、次の実行がわずかに遅くなる可能性があることです。

すべての __pycache__ フォルダを再帰的に削除するコマンド例:

find . -type d -name __pycache__ -exec rm -r {} \+

pycache を削除する主なユースケース

  • import 周りの問題のデバッグ
  • モジュール名や配置場所を変更したあと
  • デプロイ用にパッケージングするとき
  • Git コミットや Docker ビルドの前にノイズを減らしたいとき

pycache ファイルの作成を無効化するには?

環境変数を設定することで .pyc の生成を無効にできます。

export PYTHONDONTWRITEBYTECODE=1

これを有効にすると:

  • Python は .pyc ファイルを生成しなくなり
  • __pycache__ フォルダも作成されません

この設定は次のような場面でよく使われます。

  • Docker イメージ(レイヤーサイズを小さくするため)
  • CI パイプライン
  • パフォーマンスが重要でない小さなスクリプト

恒久的に有効化したい場合は、この環境変数の設定をシェルの設定ファイル(例:~/.bashrc)に追加します。


Git で pycache ファイルを無視する方法

.pyc ファイルはマシン固有で自動生成されるため、バージョン管理には含めるべきではありません。

.gitignore に次のように追記します。

__pycache__/
*.pyc

*.pyc のルールはオプションですが、古いバージョンの Python では .py ファイルと同じ場所に .pyc を置くことがあるので便利です。


pycache フォルダを削除するとどうなる?

何も壊れません。スクリプトは通常どおり実行されます。

Python は次のように動作します。

  1. .pyc がないことを検出する
  2. .py ファイルを再コンパイルする
  3. __pycache__ ディレクトリと .pyc ファイルを再作成する

影響が出るのは 削除後最初の実行だけ で、わずかに遅くなる可能性があります。


FAQ

1. Python における __pycache__ フォルダの目的は?

このフォルダはコンパイル済みの .pyc バイトコードファイルを保存するためのもので、2 回目以降の実行時に Python の起動を高速化します。

2. __pycache__ フォルダは削除してもよい?

はい、削除しても安全です。Python が自動的に再生成します。

3. Git で __pycache__ ファイルを無視するには?

.gitignore に次の内容を追加します。

__pycache__/
*.pyc