成为Python砖家(3): 何时产生字节码 .pyc 文件

好奇:.pyc和 __pycache__是啥?

你是否好奇,在某些 Python 工程中,当执行了 xxx.py脚本后,多出了 __pycache__目录?这个目录下存放的是一些 .pyc结尾的文件。
这些文件,叫做 python bytecode。 官方文档中是这样描述的:

在这里插入图片描述

在这里插入图片描述

继续好奇:何时产生 .pyc 文件?

当导入模块的时候,如果被导入的模块,未曾产生过 .pyc文件, 就会生成 .pyc文件。我们尝试写一个最简单的模块 hello, 它只提供 greet()函数,具体实现为:

hello/init.py: 内容为空

hello/hello.py:
def greet():
    print("hello world")

调用这个模块:main.py:

from hello import hello

if __name__ == '__main__':
    hello.greet()

好,我们观察在第一次引入模块前、引入后,整个目录的变化:

在这里插入图片描述

可以看到, 在第一次导入了 hello模块(from hello import hello)后,hello模块的目录下生成了子目录 pycache, 里面包含两个 .pyc文件:
__init__.cpython-311.pyc
hello.cpython-311.pyc
再次好奇: Python 标准库的 .pyc 文件在哪里?
上一步我们看到,第一次导入 hello 模块后生成了 hello.cpython-311.pyc文件,其中 hello是模块名字。 那么显然, Python 标准库,比如 os, 应该有一个对应的 os.cpython-311.pyc文件。找找看?

cd /Users/zz/soft/miniconda3
find . -name "os.cpython-311.pyc"

进一步好奇:为什么 numpy 的 .pyc 出现了多次?

大概是为了缓存优化:

在这里插入图片描述

结论

对于自己写的 Python 模块,当它第一次被导入,就会在模块目录下生成 __pycache__目录,存放各个文件的 .pyc字节缓存文件。
而 Python 标准库、numpy等常见库,在安装的时候, 会顺带提供 .pyc文件,并且可能有多份。

Reference

file:///Users/zz/Documents/pydoc-zh-cn/python-3.12.5-docs-html/glossary.html#glossary

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值