【Python入門】`__pycache__` って何?

に公開

1. 目的

Pythonでサーバープログラムを作成中、自動的に以下のようなファイルが作成されたことから、この意味を知ること

イメージ

2. __pycache__ とは?

Pythonのキャッシュファイルが格納されているディレクトリです。

__pycache__ ディレクトリは、Pythonがスクリプトを実行したときに、処理を高速化するために自動的に生成するコンパイル済みバイトコードを格納しています。

3. Pythonでコードが実行される流れ

「処理を高速化するために自動的に生成するコンパイル済みバイトコードを格納」と上記で解説しましたが、実際、Pythonで記述したソースコードはどのような流れで処理されるのかを確認していきます。

3-1. ソースコードの読み込みと字句解析/構文解析

記述したPythonソースコード(.pyファイル)が、Pythonのインタプリタによって読み込まれます。

3-1-1. 字句解析(Lexing)

コードはトークン(意味を持つ最小単位、例:キーワード、変数名、演算子など)に分割されます。

3-1-2. 構文解析(Parsing)

トークンの並びがPythonの文法に適合しているかチェックされ、抽象構文木(AST: Abstract Syntax Tree)と呼ばれるツリー構造に変換されます。

3-2. バイトコードの生成とコンパイル

次に、このASTがPythonインタプリタの主要部分である仮想マシン(PVM: Python Virtual Machine)が理解できる中間コード、バイトコードに変換されます。この過程をコンパイルと呼びます。

バイトコードは、特定のCPUに依存しない、Python独自の命令セットです。
拡張子は通常 .pyc となります。

このバイトコードは、ソースコードよりも早く実行できる形式です。

※Pythonは、ソースコード(.pyファイル)をそのまま実行するのではなく、一度「バイトコード」という中間形式に変換してから実行します。

※Pythonは、インタプリタ型言語に分類され、
「ソースコード → バイトコード(コンパイル)」
→ 「バイトコード → 機械語(実行/解釈)」の二段階を踏んでいます。

3-3. __pycache__ への保存(コンパイルされたファイルのキャッシュ)

ここで __pycache__ が登場します。

バイトコードを .pycファイル として キャッシュ(一時保存)するために、ソースコード(.pyファイル)と同じディレクトリ内に __pycache__ という名前のディレクトリが自動的に作成されます。

キャッシュされたファイルは、元のファイル名と、それを生成したPythonインタプリタのバージョン情報(例:my_module.cpython-311.pyc)を含んだ名前になります。

イメージ

Pythonが次に同じ .pyファイルを実行しようとする際、この __pycache__ 内の .pycファイルを参照し、元のソースファイルが更新されていないことを確認できれば、3-1. と 3-2. のコンパイル作業をスキップして、すぐに 3-4. に進むことができます。

つまり、2回目以降の実行時には、ソースコード(.py)に変更がなければ、Pythonはこの.pycファイルを読み込むだけで済むため、毎回バイトコードへの変換処理を行なう必要がなくなり、読み込み時間を短縮できることを意味します。

3-4. 仮想マシンによるバイトコードの実行

最後に、生成またはキャッシュされたバイトコードが、Python仮想マシン(PVM)によって実行されます。

PVMは、バイトコードの命令を一つずつ読み込み、実際の機械語に変換しながら実行(解釈)していきます。

これによって、プログラムが意図した処理(変数の操作、関数の呼び出し、入出力など)が実行されます。

4. 消しても大丈夫?

__pycache__ ディレクトリやその中の.pycファイルを削除しても問題ありません。

次にPythonプログラムを実行したときに、必要に応じて自動で再生成されます。

まとめ

__pycache__ とは、Pythonがスクリプトを実行したときに、自動的に生成されるコンパイル済みバイトコードを格納したディレクトリであることがお分かりいただけたと思います。

これによって、インタープリタの読み込みの都度コンパイルするコストが省けるため、その分処理が早くなります。

最後までお読みいただき、ありがとうございました。

参考URL

https://docs.kanaries.net/ja/topics/Python/pycache

https://qiita.com/Kobayashi2019/items/03e31ee50b924f428e71

https://stackoverflow.com/questions/16869024/what-is-pycache

Discussion