__pycache__文件夹是什么,是缓存文件吗,可以删除吗

news2024/9/20 12:36:02

1.什么是__pycache__文件

用python编写好一个工程,在第一次运行后,总会发现工程根目录下生成了一个__pycache__文件夹,里面是和py文件同名的各种*.pyc或者*.pyo文件。名字上看应该是相应的缓存文件。

那为什么会出现__pycache__文件,和Python解释器有关

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

解释器的具体工作:

  1. 完成模块的加载和链接
  2. 将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取
  3. 从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc或.pyo文件中,以保存当前目录下所有脚本的字节码文件

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

2.为什么会出现__PYCACHE__文件夹

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

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

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

3.什么时候会出现__PYCACHE__文件夹

工程目录下有__main__.py文件,和其他将要调用的模块时。如果只有当前运行的脚本
“main”,则不会生成 pycache 的文件。

4.python编译代码流程

在这里插入图片描述

4.1 源代码(source code)

我们自己编写的Python、Java、C++等代码通常指的就是源代码,源代码的特点是人类可读。但是CPU只能读懂二进制,看不懂我们写的源代码,因此还需要进行编译(compile)。

4.2 字节码(byte code)

因为CPU读不懂源代码,因此需要对源代码进行编译:把源代码(原始语言)转换成另一种编程语言(目标语言)的过程称为编译。但是在Python中,并不是直接把源代码编译为机器码的。还需要经历一个中间语言,即字节码。字节码以字节的形式方式存储,如

b'd\x00Z\x00e\x01e\x02e\x00\x83\x01\xa0\x03\xa1\x00e\x00d
\x01\x83\x03Z\x04e\x04j\x05Z\x06e\x07d\x02e\x06\x9b\x00\x9d
\x02\x83\x01\x01\x00d\x03S\x00'

4.3 机器码(machine code)

机器码是CPU可直接解读的代码,也称为native code。机器码就是计算机可以直接执行,并且执行速度最快的代码。

4.4 解释器(interpreter)

在Python中,解释器是一种让Python程序运行起来的程序,在IDE中可以看到对解释器进行选择。

在这里插入图片描述

4.5 虚拟机(virtual machine)

生成了字节码之后,就会被发送到Python虚拟机(Python virtual machine, PVM)中执行,因此Python虚拟机是Python解释器的最后一步。
在这里插入图片描述

5. Python工作机制

对于一个*.py文件,在执行过程中解释器会先把*.py文件编译为字节码,并缓存在*.pyc文件中;
编译产生的字节码被python虚拟机逐行执行

5.1为什么要有__pycache__文件夹?

如上文所说,字节码缓存在*.pyc文件中,而__pycache__文件夹正是缓存*.pyc地方。
*.pyc文件的命名格式是<module>.<interpreter_version>.pyc,如下图所示。
注意,对于被导入的module才会生成对应的*.pyc文件,
因此下图中虽然执行的是python ./demo.py,但是并没有看到有demo.cpython-39.pyc文件生成。

图4

那么最根本的问题来了,为什么要这么做呢?为什么要设置一个中间代码呢?这个背后的逻辑和Java是一样,主要是为了解决跨平台性。Java的执行过程也是先把源代码编译为字节码,然后进入Java虚拟机进行执行。Java虚拟机会屏蔽掉不同操作系统以及CPU之间的差异,因此解决跨平台性的问题。

虽然提升了跨平台性,却因为中间码的存在降低了运行速度。Python如何解决这一问题呢?Python在下一次执行时,会检查源代码文件(*.py)文件与字节码文件(*.pyc)的时间戳,如果时间戳一致,说明源代码没有修改,那么就会跳过对源代码的编译过程而直接加载字节码进入虚拟机执行。如果时间戳不一致,才会重新编译。而字节码的执行相对较快,这样就大大缩短了项目运行前的准备时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go chan基本使用

1、有缓冲的chan 与无缓冲的chan 怎么理解这个缓冲&#xff0c;我个人的理解是是执行这个chan 操作的时候是否发送阻塞。 操作&#xff1a;读和写。 读取的时候&#xff0c;我们都应该要是阻塞的&#xff0c;例如我们的socket、的recv函数。当然取决于你设置的是阻塞的套接字还…

在安装docker配置端口时 centos7 防火墙规则失效

一、问题 1、做端口映射管理的时候&#xff0c;自己关闭了防火墙&#xff0c;或者开启防火墙&#xff0c;或者指定开关端口&#xff0c;但是都不影响端口的使用&#xff0c;这就很奇怪&#xff0c;也就是本文的内容&#xff01; 2、思路&#xff0c;确认是请求到了防火墙的那…

MySQL: 自动添加约束、更改(删除)表名和字段、删除表

目录 自动添加表的属性&#xff1a; 向表内插入数据&#xff1a; 查看表中的数据&#xff1a; 查看表结构&#xff1a; 查看表的详细结构&#xff1a; 更改表名和字段&#xff1a; 更改表名&#xff1a; 更改字段数据类型&#xff1a; 修改字段名&#xff1a; 添加字段…

约瑟夫环+考勤刷卡(蓝桥杯JAVA解法)

约瑟夫环&#xff1a;用户登录 题目描述 设有 n 个人围坐在圆桌周围&#xff0c;现从某个位置 k 上的人开始报数&#xff0c;报数到 m 的人就站出来。下一个人&#xff0c;即原来的第 m1 个位置上的人&#xff0c;又从 1 开始报数&#xff0c;再报数到 m 的人站出来。依次重复…

上传ipa到appstore详细步骤

使用hbuilderx或apicloud云打包后&#xff0c;会生成一个ipa文件&#xff0c;而iphone是无法直接安装这个ipa文件的&#xff0c;需要将这个ipa文件上架&#xff0c;才能安装使用。那么如何上架呢&#xff1f; hbuilderx和apicloud并没有上架的教程&#xff0c;而苹果官方是推荐…

基于Jenkins,docker实现自动化部署(持续交互)【转】

前言 随着业务的增长&#xff0c;需求也开始增多&#xff0c;每个需求的大小&#xff0c;开发周期&#xff0c;发布时间都不一致。基于微服务的系统架构&#xff0c;功能的叠加&#xff0c;对应的服务的数量也在增加&#xff0c;大小功能的快速迭代&#xff0c;更加要求部署的…

在 Apple 设备(包括 iPad、iOS 和 MacBook)上为用户提供完整的 SAP GUI

苹果应用功能 高效且直观的用户界面。 访问 VA01、MI31、MI04、IW21 等。– 无编程 自动化和简化您的 SAP 流程&#xff0c;如库存盘点 在 Apple 设备&#xff08;包括 iPad、iOS 和 MacBook&#xff09;上为用户提供完整的 SAP GUI&#xff0c;利用他们已经了解的 UI 丰富性并…

持续集成——web自动化测试集成实战

文章目录 一、Web自动化测试持续集成的好处二、环境准备三、Jenkins节点挂载四、节点环境的配置1、JDK2、Chrome 浏览器3、chromedriver4、Python3环境5、allure-commandline工具6、allure插件 五、本地运行待测代码(保证代码没有问题)六、库文件的导出七、Jenkins上运行代码配…

高功率激光切割中不良现象的排除技巧

高功率切割市场现状 随着激光行业的发展和下游产业需求的变化&#xff0c;高功率的激光切割设备已逐渐成为市场关注的热点。高功率激光切割凭着速度和厚度上无可比拟的优势&#xff0c;目前已获得了市场的广泛认可。 但由于高功率激光切割技术尚处于普及的初级阶段&#xff0c;…

栈溢出的原理

目录 缓冲区 我们先以解决这个题目为准 然后通过这个题目去做透 gdb 代码段 栈中 当前时刻寄存器存储的内容 1 寻找漏洞函数 输入 输出 字符串 2 确定填充长度 覆盖函数返回地址 覆盖栈上变量的内容 覆盖bss段 栈溢出是在堆栈中 对某一个变量无限制的输入 超出了…

【三十天精通Vue 3】第十九天 Vue 3的渐进式Web应用程序详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、什么是渐进式 Web 应用程序1.1 渐进式 Web 应用程序的定义…

市场预测美联储加息的有效性几何

美联储加息已狂飙一年&#xff0c;很多相关预测美联储加息降息的文章都会提到“一年内加息多少次的概率是多少多少”这种表述&#xff0c;那么这个数据是怎样计算的&#xff1f;本期笔者将简单讨论美国联邦利率的运作机制&#xff0c;介绍用于预测联储加/降息概率的方式&#x…

vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode

通过使用 qrcode 生成二维码&#xff0c; 使用 jszip 打包批量二维码文件&#xff0c; 使用 file-saver 下载打包好的zip文件&#xff0c; 使用 vue-print-nb 打印生成的二维码 生成二维码&#xff1a; 打印二维码 下载二维码 1. 批量生成二维码—安装依赖 ![请添加图片描述]…

CH32F203RCT6 pin2pin兼容STM32F103RCT6

32位大容量通用型Cortex-M3单片机 CH32F203是基于Cortex-M3内核设计的工业级大容量通用微控制器&#xff0c;此系列主频高达144MHz&#xff0c;独立了GPIO电压&#xff08;与系统供电分离&#xff09;。资源同比增加了随机数单元&#xff0c;4组运放比较器&#xff1b;提高串口…

硅烷PEG马来酰亚胺,Silane-PEG-Mal,马来酰亚胺聚乙二醇硅烷

中文名称&#xff1a;马来酰亚胺聚乙二醇硅烷 英文名称&#xff1a;Silane-PEG-Maleimide&#xff0c;Silane-PEG-MAL 性状&#xff1a;液体或者固体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水、DMSO、DMF、DCM等常规性有机溶剂 活性基团&#xff1a;MAL 分子量&am…

【spring事务】源码分析

项目启动时&#xff0c;创建代理过程 initializeBean.applyBeanPostProcessorsAfterInitialization 由AnnotationAwareAspectJAutoProxyCreator来处理 AnnotationAwareAspectJAutoProxyCreator wrapIfNecessary 通过getAdvicesAndAdvisorsForBean获取bean满足的Advisor&…

DHCP 服务器监控

网络中使用了数千个 IP 地址&#xff0c;当今大多数组织中的 IP 地址都由 DHCP 服务器提供服务。必须发现可用的 IP 地址、了解如何预配 IP 并了解 IP 池利用率。使用 DHCP 服务器进行 IP 预配可以更轻松地获得这些重要见解&#xff0c;并根据组织的不同需求分配不同的范围。这…

SYSU程设c++(第十周)继承与派生、继承的访问控制、继承的构造函数与析构函数

继承与派生 使用背景&#xff1a; 当定义一个新的类 B 时&#xff0c;如果发现类 B 拥有某个已写好的类 A 的全部特性&#xff0c;此外还有类 A 没有的特性&#xff0c;那么就不必从头重写类 B&#xff0c;而是把类 A 作为一个“基类”&#xff08;也称“父类”&#xff09;&a…

【正则表达式上】——03全栈开发——如桃花来

目录索引 介绍&#xff1a;常见匹配模式&#xff1a; re.match()方法&#xff1a;常规匹配&#xff1a;泛匹配&#xff1a; 匹配目标-匹配分组&#xff1a;贪婪匹配&#xff1a;非贪婪匹配&#xff1a; 介绍&#xff1a; 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就…

Unsupervised Point Cloud Pre-training via Occlusion Completion

题目&#xff1a;Unsupervised Point Cloud Pre-training via Occlusion Completion 摘要 方法&#xff1a; 提出一种用于点云的预训练方法Occlusion Completion (OcCo) 技术细节&#xff1a; mask相机视角里被遮挡的点学习一个encoder-decoder模型&#xff0c;用于重建被遮…