博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python项目---数据可视化(02)
阅读量:5105 次
发布时间:2019-06-13

本文共 1677 字,大约阅读时间需要 5 分钟。

         今天编写程序时,发现了一个有趣的现象。当执行import语句时,运行以后,将会脚本目录下生成一个__pycache__文件。于是做了如下总结解释:

一. python基本运行机制

     Python程序运行时不需要编译成二进制代码,而直接从源码运行程序,简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。

     解释器的具体工作:

     1 完成模块的加载和链接;

     2 将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取;

     3 从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc或.pyo文件中,以保存当前目录下所有脚本的字节码文件;

     * 之后若再次执行该脚本,它先检查【本地是否有上述字节码文件】和【该字节码文件的修改时间是否与其脚本一致】。是就直接执行,否则重复上述步骤。

二. 为何会出现该文件

     python解释器会将 *.py 脚本文件进行编译,并将编译结果保存到__pycache__目录中。

    下次再执行工程时,若解释器发现这个 *.py 脚本没有修改过,就会跳过编译这一步,直接运行以前生成的保存在 __pycache__文件夹里的 *.pyc 文件。

     这样工程较大时就可以大大缩短项目运行前的准备时间;如果你只需执行一个小工程,没关系 忽略这个文件夹就行。

三. 如何使该文件不出现

     1. 单次关闭: 运行脚本时添加 -B 参数即可

     2. 永久关闭: 设置环境变量 PYTHONDONTWRITEBYTECODE=1 即可

四. 解释下该文件的内容

     该文件里有大小随时变化的类似格式random_walk.cpython-37.pyc文件,点号中的第一位代表被inport进来的模板。cpython-37cpython代表的是c语言实现的Python解释器,-37代表的是版本为3.7版。 

五. 模块调用

Python中导入模块时,实际上会把被导入的模块执行一遍,如下: 

先看被调用的模块test.py

def haha():    print("哈哈") haha()

再看主程序main.py

import testprint("一条鱼")

执行结果是:

哈哈一条鱼

那怎么才能只是单纯调用而不执行被调用模块的代码呢?要想被调用模块代码不被执行,前提得知道变量__name__是什么意思,简单来说就是,如果不涉及模块导入的话,__name__的值就是” __main__“,如果当此模块被导入引用的话,那么这个模块内的__name__值就是文件的名字(不带.py),如下test_1.py

def haha():    print("哈哈") haha() print(__name__)

test_1.py执行结果为:

哈哈__main__

如果test_1被导入引用的话,如test_2

import test_1print("一条鱼")

test_2x运行结果为:

哈哈test_1一条鱼

上边所说要是弄懂的话,那我们在被调用的模块中,可执行的代码前加上这么一句判断,if __name__ == '__main__':,被调用的模块的代码就不会被执行了!或者再启动的时候添加选项参数。这个文件时可以删除的,不过删除意义不大。反而存在的话,加载会更快。

 

 

 

 

note: pyo和.pyc文件的执行速度不会比.py文件快,快的地方在于模块加载的速度

 

考文献:

https://blog.csdn.net/yitiaodashu/article/details/79023987

https://www.cnblogs.com/Ralph-Wang/archive/2013/11/23/3439080.html

https://jingyan.baidu.com/article/c14654134a7bdd0bfcfc4cea.html

转载于:https://www.cnblogs.com/Hermioner/p/9448627.html

你可能感兴趣的文章
元数据--你有没有注意?
查看>>
数据库路由中间件MyCat - 使用篇(2)
查看>>
pycharm 码
查看>>
事件日志ID 2511:服务器服务无法重新创建 <sharename> 共享关系,因为 <address> 目录已不再存在...
查看>>
python3 Flask安装
查看>>
js弹出div层,弹出层页面底部出现UL出现一条线问题
查看>>
debian下安装wps office
查看>>
装备属性转移脚本
查看>>
Python控制电脑
查看>>
在LINQ TO SQL 中使用MVC3中的DataAnnotations 【MetadataType】
查看>>
MSSQL2005约束(五)-default约束
查看>>
[Codeforces Round #159 (Div. 2)]A. Sockets
查看>>
【转载】Cacti安装的详细步骤
查看>>
weblogic设置数据库自动重连
查看>>
[数据结构][LINUX内核编程]学习笔记(二)
查看>>
Spring AOP 理论
查看>>
Java EE、Java SE和Java ME
查看>>
为什么要使用MQ消息中间件?它解决了什么问题?
查看>>
二手书网页版mis系统
查看>>
Oracle_高级功能(9) 性能优化
查看>>