【Python】自動作成される「__pycache__」の役割について

Python

はじめに

にゃーすけ
にゃーすけ

Pythonを触っていたら、勝手に__pycache__というフォルダが作られているにゃ。
これは何にゃ?

しげっち
しげっち

Pythonをコンパイルした時に自動で作成されるみたいだね。
詳しくみていこう!

__pycache__が作成されるタイミング

__pycache__は「パイキャッシュ」と読みます。これはPythonをコンパイルしたタイミングで自動作成されます。

ただし、作成されるのは自作モジュールをimportしている場合です。

サンプルを見てみましょう。

def Calc(i1, i2):
    return i1+i2

print(Calc(2,3))

test.pyというファイルを準備して、計算結果を表示するだけの簡単なプログラムを記載しました。
これを実行しても__pycache__ディレクトリは作成されません。

それでは、もう一つcalculate.pyというファイルを準備して、test.pyに記述してあるcalc関数を準備したファイルに移動します。
そして、test.pyでimportして実行してみます。
下記のような構成になります。

from calclate import Calc

print(Calc(2,3))
def Calc(i1, i2):
    return i1+i2

これを実行すると、__pycache__ディレクトリが作成されました。

__pycache__で作成されるファイル

作成されたファイルの中身を見ようとしてもバイナリ形式のため見えませんでした。

ファイル名を見てみると、calclateはモジュールの名前で、その跡がcpython-38となっています。
実はこのサンプルの時に使用したPythonのバージョンは3.8でした。つまりファイル名は下記のような構成になっているようです。

モジュール名.Pythonのバージョン.pyc

__pycache__の役割

にゃーすけ
にゃーすけ

__pycache__が作成されるタイミングと条件はわかったけど、何のために作成されるにゃ?

これは名前から推測される通り、モジュールをコンパイルしたキャッシュを保管するディレクトリです。
このキャッシュがあれば、再度プログラムを実行する際に、作成済みのキャッシュから読み込みを行うため処理が早くなるメリットがあります。

キャッシュファイルは、プログラム実行の際にモジュールとの更新日時を比較し、モジュールが更新されていれば再コンパイルが行われます。

__pycache__を作成しない方法

キャッシュを作成したくない場合は次の方法があります。

コマンド実行時に-Bをつける

python -B test.py

小文字ではなく大文字のBにする必要があります。

ソース内にキャッシュを作成しないようにする処理を書く

import sys
sys.dont_write_bytecode = True

from calclate import Calc
print(Calc(2,3))

sys.dont_write_bytecode = Trueを記述することでキャッシュが作成されなくなります。
ただし、モジュールをimportする処理よりも前に書かないといけません。

まとめ

__pycache__について解説しました。

  • __pycache__ディレクトリはモジュールをimportする際に自動作成される。
  • キャッシュファイル名の構成はモジュール名.Pythonのバージョン.pyc
  • キャッシュファイルがあれば、再実行する際の読み込みが高速化される。
  • キャッシュファイルは、モジュールが更新されると再作成される。
  • キャッシュファイルは作成しないようにすることもできる。

にゃーすけ
にゃーすけ

にゃーすけのキャッシュは全て戸棚の中にあるにゃ!

しげっち
しげっち

戸棚?どれどれ・・・。
全部お菓子じゃん!

にゃーすけ
にゃーすけ

最後まで読んでいただき、ありがとうだにゃ!

タイトルとURLをコピーしました