Python在何时会生成pyc文件呢?

Python在何时会生成pyc文件呢?

  事情大概是这样的,以前我一直觉得python文件在执行过以后就会生成pyc文件,后来一次偶然状况下,发现仍是本身too young too simple,在看过其余大神文章而且本身验证以后,发现仍是有点意思的,权当没事写点文章吧。python

什么是pyc文件呢?

  简单来讲,pyc文件就是Python的字节码文件,咱们都知道Python是一种全平台的解释性语言,全平台其实就是Python文件在通过解释器解释以后(或者称为编译)生成的pyc文件能够在多个平台下运行,这样一样也能够隐藏源代码。其实,Python是彻底面向对象的语言,Python文件在通过解释器解释后生成字节码对象PyCodeObject,pyc文件能够理解为是PyCodeObject对象的持久化保存方式。数据库

何时会生成pyc文件呢?

  pyc文件只有在文件被当成模块导入时才会生成。也就是说,Python解释器认为,只有import进行的模块才须要被重用。 生成pyc文件的好处显而易见,当咱们屡次运行程序时,不须要从新对该模块进行从新的解释。主文件通常只须要加载一次不会被其余模块导入,因此通常主文件不会生成pyc文件。
  下面来举个例子说明,见代码缓存

文件print_hello.py

print("hello")
import print_hello

执行python print_hello.py函数

E:\test>python print_hello.py
hello

E:\test>dir
 驱动器 E 中的卷是 文件
 卷的序列号是 B612-D1B0

 E:\test 的目录

2017/09/25  21:09    <DIR>          .
2017/09/25  21:09    <DIR>          ..
2017/09/25  21:08                18 import_hello.py
2017/09/25  21:08                14 print_hello.py
               2 个文件             32 字节
               2 个目录 49,367,699,456 可用字节

能够发现并无pyc文件生成,
执行python import_hello.py设计

E:\test>python import_hello.py
hello

E:\test>dir
 驱动器 E 中的卷是 文件
 卷的序列号是 B612-D1B0

 E:\test 的目录

2017/09/25  21:12    <DIR>          .
2017/09/25  21:12    <DIR>          ..
2017/09/25  21:08                18 import_hello.py
2017/09/25  21:08                14 print_hello.py
2017/09/25  21:12               124 print_hello.pyc
               3 个文件            156 字节
               2 个目录 49,367,699,456 可用字节

须要说明两点的是:code

  • 执行python import_hello.py,开始执行import print_hello,导入print_hello模块,而后执行了print_hello模块里面的代码,因此咱们能够看到有“hello”输出;
  • 若是不想执行里面的代码,通常能够将代码封装在一个类或者函数里面,而后加个if判断,相似下面这样,表示若是是被导入则不执行if下的代码,若是做为程序入口或者脚本执行,则执行if下的代码。
if __name__ == "__main__":
    print("hello")

pyc文件的过时时间

  • 在生成pyc文件的同时,写入了一个Long型的变量,用于记录最近修改的时间;
  • 每次载入以前都先检查一下py文件和pyc文件的最后修改日期,若是不一致则会生成一个新的pyc文件

总结

  总的来讲,了解pyc其实对于Python开发者来讲并无多大的意义,本着钻研的精神写下这篇文章,感受有一下几点能够考虑对象

  • Python的pyc文件从必定意义上能够减小解释器解释Python文件的时间,没必要每次都要解释编译一遍,方便下次快速加载,有点相似数据库的缓存吧;
  • 想一想若是咱们想设计一个系统,相似主文件这种不会被重用,而其余模块可能会被重用,咱们就须要分开设计对待了吧;
  • 在设计缓存系统时候,相似Python这种对比最后修改时间的方式,是否是能够给咱们一点启示呢?
相关文章
相关标签/搜索