知识星球: 迷途小书童;个人微信:xituxiaoshutong100

Python中的pyc文件

Python基础 迷途小书童 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)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址