5
5

More than 3 years have passed since last update.

最近pycファイル見ないなーと思っていたら、python3でpycacheに隔離されていた話

Last updated at Posted at 2020-03-02

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
a.py
import b
import c

b.hello()
c.goodmorning()
b.py
def hello():
    print("hello")
c.py
def goodmorning():
    print("goodmorning")

結果

hello
goodmorning

$ ls
a.py        b.py        b.pyc       c.py        c.pyc

pycファイルがこんにちはしています。

pycの行方の真相

しかしいつからか、このpycファイルがすぐそばに作られなくなりました。

てっきり
image.png

かと思いましたが、そんな事はなく。

python3.2から格納場所が変更になったそうです。

これらの新しいファイルがソースディレクトリを散らかすのを防ぐために、 pyc ファイルはパッケージディレクトリの下の "pycache" ディレクトリに収集するようになりました。

ふむふむ、確かにソースコードを探すのに二重であって見づらかった。

なので管理方法を変えたわけですね。

置き場が新しいpycファイルを確認する

今度は同じファイル構成ですがpython3.2で確認(前述のは2.7で試していました。)

 ├─ a.py
 ├─ b.py
 └─ c.py
a.py
import b
import c

b.hello()
c.goodmorning()
b.py
def hello():
    print("hello")
c.py
def goodmorning():
    print("goodmorning")

結果

$ ls
__pycache__ a.py        b.py        c.py
$ ls __pycache__/
b.cpython-37.pyc    c.cpython-37.pyc

このようにpycache/配下に.pycが作成されているのが確認できました!

5
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5