pythonを触ってる中で
「あれ…?pycファイル最近見ないな?」
と気づきました。
そしたら、仕様がしっかりと変わっていた(結構古いですが)ので書いてみました
pycファイルとは
公式にはこんな説明が書いています。
CPython compiles its source code into "byte code", and for performance reasons, it caches this byte code on the file system whenever the source file has changes. This makes loading of Python modules much faster because the compilation phase can be bypassed. When your source file is foo.py, CPython caches the byte code in a foo.pyc file right next to the source.
3行でまとめると
- importするソースコードを随時コンパイルしてコンピュータが読みやすいバイナリファイルにするよ!
- バイナリファイルはロードがとっても早くなるよ!
- バイナリファイルは該当ファイルのすぐそばにpycファイルとして作られるよ!
と書いています。(すごい大雑把です)
ですので読み込みを高速化してくれる役割を担ってくれているわけです。
pycファイルを作ってみよう!
├─ a.py
├─ b.py
└─ c.py
import b
import c
b.hello()
c.goodmorning()
def hello():
print("hello")
def goodmorning():
print("goodmorning")
結果
hello
goodmorning
$ ls
a.py b.py b.pyc c.py c.pyc
pycファイルがこんにちはしています。
pycの行方の真相
しかしいつからか、このpycファイルがすぐそばに作られなくなりました。
かと思いましたが、そんな事はなく。
python3.2から格納場所が変更になったそうです。
これらの新しいファイルがソースディレクトリを散らかすのを防ぐために、 pyc ファイルはパッケージディレクトリの下の "pycache" ディレクトリに収集するようになりました。
ふむふむ、確かにソースコードを探すのに二重であって見づらかった。
なので管理方法を変えたわけですね。
置き場が新しいpycファイルを確認する
今度は同じファイル構成ですがpython3.2で確認(前述のは2.7で試していました。)
├─ a.py
├─ b.py
└─ c.py
import b
import c
b.hello()
c.goodmorning()
def hello():
print("hello")
def goodmorning():
print("goodmorning")
結果
$ ls
__pycache__ a.py b.py c.py
$ ls __pycache__/
b.cpython-37.pyc c.cpython-37.pyc
このように__pycache__/配下に.pycが作成されているのが確認できました!