欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

Python中的pyc文件

Python基础 迷途小书童 4年前 (2020-10-30) 4662次浏览 0个评论

软硬件环境

  • windows 10 64bits
  • anaconda with python 3.7

视频看这里

此处是 youtube 的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。

什么是pyc

pyc 中的 ccompiled 的缩写,编译后的意思。pyc 文件是由 python 解释器将模块的源码转换后的字节码文件,从而提升代码运行的速度。

解释型语言和编译型语言

计算机是不能够识别高级语言的,所以当我们运行一个高级语言编写的程序的时候,就需要将高级语言翻译成计算机能读懂的机器语言。这个过程分成两类,第一种是编译,另一种是解释。编译型语言在程序执行之前,会先通过编译器对程序执行一个编译的过程,把程序转变成机器语言,运行的时候就不需要翻译,而直接执行就可以了,C 语言就是最典型的编译型语言。解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是 Ruby。由此可见,在运行效率上,解释型语言是无法跟编译型语言相比的。

那问题来了,python 到底是解释型语言还是编译型语言?

python 是编译型 + 解释型的语言,执行的时候是由 python 解释器,逐行编译和解释,然后运行,所以 python 的运行性能会低于编译型语言。为了提高性能,python 解释器,会将模块(往往是需要复用的代码)的编译 + 解释的结果,保存在 pyc 中。这样下次执行的时候,就省了编译这个环节,提高了性能。一次性的脚本文件(比如只有 test.py 且不调用 module 模块),解释器默认是不会保存编译+解释的结果,也就是没有 pyc 文件。

示例

这里准备2个文件,被调用模块 module.py,内容是

def add(x,  y):
    return x + y

test.py 文件中调用 module 中的 add 方法并打印输出

from module import add

a = 2
b = 4
c = add(a, b)
print(c)

pyc

然后打开终端 powershell,执行 python test.py,在同一级目录下会生成文件夹__pycache__,在 __pycache__ 目录下还有一个文件 module.cpython-37.pyc,它是一个二进制文件

pyc

通过使用在线 pyc 反编译工具 https://tool.lu/pyc/ 知道,module.cpython-37.pyc 就是模块 module.py 编译后的内容

pyc

接下来,我们修改下 module.py,加句注释

# add comment
def add(x,  y):
    return x + y

然后再次执行 python test.py,我们会发现 __pycache__ 下的 module.cpython-37.pyc 也被修改了

pyc

我们进入到 __pycache__,将 module.cpython-37.pyc 重命名为 model.pyc,然后将上层目录中的 test.py 拷贝过来,接着执行 python test.py

pyc

可以看到,我们可以直接在 python 源码中直接使用 pyc 文件,而不需要 module.py 了,这有点像 c 语言中动态库或静态库,pyc 的这种用法通常用来保护源码。

前面我们讲过解释器默认不支持单文件生成 pyc,如果想生成,需要设定参数处理

python -m py_compile test.py

pyc

生成了 __pycache__,我们进入文件夹,可以直接执行 pyc

python test.cpython-37.pyc

pyc

喜欢 (0)

您必须 登录 才能发表评论!