欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

Python中的pyc文件

Python基础 迷途小书童 3年前 (2020-10-30) 3643次浏览 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)

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

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.