话不多说上图:




python雨动态代码 python动态代码执行_python


图1 python代码运行过程

注1:C、C++等语言都是:先经过预处理、编译、汇编、链接、最终生成机器代码(可执行文件)。而python每次运行,多了中间的两步(编译、解释),速度自然变慢,但另一方面,python不用担心编译和库的连接问题,这些工作都交给python虚拟机来完成,因此,开发工作会相对轻松,同时距离物理机器更远了,python更加容易移植,无需改动就可在多平台运行。

注2:.pyc文件存在的目的:
.pyc是PyCodeObject的一种永久保存方式,对可能重用的模块不用再重新解释,提高程序运行速度。

注3:python 把 可能重用的模块写入进 .pyc 文件,python虚拟机在解释代码时,就不用再重新解释 这些重用的模块代码(.pyc),而虚拟机需要一步步解释的是:main.py,这个 main.py 主要是负责 调度 各个模块,它的代码量是相当少的,相当于 web controller。

疑问1:如果我修改了引用的模块,是否还手动移除 .pyc文件?

其实:CodeObject在写入进.pyc文件之时,也写了一个long型到 .pyc文件中,用来记录文件(.py, 可能重用的模块)最后的修改时间,等下次写入之前,会把准备写入的文件(.py)最后修改日期与已经存在于.pyc中的日期进行核对,如果发生改变,则重新写入 .pyc文件,否则不变。

疑问2:既然你把重用模块写入了.pyc文件,为什么不把 main.py 也写进 .pyc文件呢 ?这样不应该更快吗?

这个问题:需要回归到写python代码主要是用来干啥的?

① 执行测试;

② 开启一个web进程;

③ 执行一个程序脚本;

第一种情况:如果是测试,哪怕所有的文件不是 .pyc也没有关系;

第二种情况:不是作web不是很清楚...,反正也不需要;

第三种情况:执行一个脚本,一个程序的主入口,类似于web程序的controller,它负责的是所有模块的调试工作,不包含任何的主逻辑在内,其实就是一个Facade(外观模式),没有任何的细节逻辑。因此python解释器只把我们可能重用的模块持久化 .pyc文件。

以上内容仅供借鉴!!!