Python中 `__pycache__` 文件夹是什么?

news/2024/11/15 0:35:47/文章来源:https://www.cnblogs.com/swindler/p/18302455

引言

当你编写一个独立的Python脚本时,目录结构看起来可能没什么特别。但随着项目逐渐变得复杂,你可能会倾向于将一些功能分离到其他模块或包中。这时,你可能会发现在源文件旁边,似乎毫无规律地,突然冒出一个__pycache__文件夹。

project/
│
├── mathematics/
│   │
│   ├── __pycache__/
│   │
│   ├── arithmetic/
│   │   ├── __init__.py
│   │   ├── add.py
│   │   └── sub.py
│   │
│   ├── geometry/
│   │   │
│   │   ├── __pycache__/
│   │   │
│   │   ├── __init__.py
│   │   └── shapes.py
│   │
│   └── __init__.py
│
└── calculator.py

请留意,当您的项目目录结构中有多级嵌套的子包时,pycache 文件夹可能会随机出现在不同的层级。与此同时,存放您 Python 源代码的其他包或文件夹,可能并没有这个神秘的缓存文件夹。

在您克隆了包含Python项目的远程Git仓库并执行了相应的代码之后,您可能会碰到相似的问题。究竟是什么触发了 pycache 文件夹的生成,它又有什么作用呢?

简而言之:它使导入 Python 模块更快

虽然 Python 属于解释型语言,但其解释器并不是直接执行您的 Python 代码,这样做效率会很低。实际上,当您执行一个 Python 脚本或导入模块时,解释器会先将您的源代码转换成字节码,这是一种代码的中间二进制形式。

这种字节码允许解释器省略掉一些重复的操作,比如每次执行程序时都重新进行词法分析、解析成抽象语法树以及验证代码的正确性。只要源代码保持不变,Python 就可以直接使用这个已经准备好的中间表示来执行,从而节省了时间,加快了脚本的启动速度。

要记住的是,通过 pycache 加载编译后的字节码确实可以加快 Python 模块的导入速度,但这并不会影响到模块的执行速度。

Python 利用项目中的 pycache 文件夹来存放已编译的模块字节码。当您再次运行程序时,如果这些字节码与源文件保持同步更新,解释器会尝试从这些文件夹中加载模块的预编译版本。需要指出的是,这种缓存机制仅在您通过代码导入模块时激活,而不是在命令行中直接执行脚本。

除了磁盘上的字节码缓存,Python 还维护了一个内存中的模块缓存,您可以通过 sys.modules 字典来访问。这确保了在您的程序中多次从不同位置导入同一个模块时,Python 会直接使用已导入的模块,无需再次加载或编译。这两种机制相辅相成,有效降低了导入 Python 模块所需的开销。

本文由mdnice多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 滚动轮播文字(走马灯效果)

使用 Control 实现自定义控件,源码可加微信号:microsoft-zh

0185-在 VSCode 中远程调试

环境Time 2022-11-13 WSL-Ubuntu 22.04 QEMU 6.2.0 Rust 1.67.0-nightly VSCode 1.73.1前言 说明 参考:https://os.phil-opp.com/minimal-rust-kernel 目标 将上一节编写的可执行文件制作成 QEMU 可以启动的镜像。使用 QEMU 启动后,使用 VSCode 远程调试。 启动 QEMU 脚本 #!…

mac整体配置安装hadoop

根据自身芯片系统下载虚拟机 下载vm虚拟机:Download VMware Fusion | VMware VMware Fusion对应的CentOS8下载的版本为:CentOS-8-XX-aarch64-dvd-custom-XX.iso。 配置yum:参考博客:https://blog.csdn.net/qq_29759839/article/details/125860618 core-site.xml <confi…

理想的文件摆渡系统,了解一下!

"文件摆渡"通常指在不同系统、设备或平台之间传输文件的过程,可以是手动摆渡,比如使用USB闪存驱动器、移动硬盘等物理存储设备来移动文件,也可以是自动化摆渡,比如通过网络或专门的文件摆渡系统来实现文件的传输。为了保护内部数据安全,企业通过会进行网络隔离,…

想看源码但是无从下口怎么办?

相信不少同学都有欧阳这种情况,年初的时候给自己制定了一份关于学习英语和源码的详细年度计划。但是到了实际执行的时候因为各种情况制定的计划基本都没有完成,年底回顾时发现年初制定的计划基本都没完成。痛定思痛,第二年年初决定再次制定一份学习英语和源码的详细年度计划…

C++11标准库 互斥锁 mutex 梳理

目录<mutex>std::call_once函数例程:使用call_once实现的单例模式std::mutex类 -- 独占互斥锁成员函数std::recursive_mutex类 -- 递归互斥锁使用注意:描述:std::timed_mutex类 -- 超时互斥锁描述:成员函数:std::recursive_timed_mutex类std::lock_guard模板类函数原型:s…

【译】The danger of TaskCompletionSource class

来自 Sergey Tepliakov的另一篇 https://devblogs.microsoft.com/premier-developer/the-danger-of-taskcompletionsourcet-class/#comments当使用async/await时,如果您想手动控制任务的生存期,TaskCompletionSource<T>类是一个非常有用的工具。下面是TaskCompletionSo…

Windows版PostgreSQL数据库下载及安装教程(关系型数据库管理系统)

前言 PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS)。PostgreSQL最初设想于1986年,当时被叫做Berkley Postgres Project。该项目一直到1994年都处于演进和修改中,直到开发人员Andrew Yu和Jolly Chen在Postgres中添加了一个SQL(Str…

异构数据源数据同步 → 从源码分析 DataX 敏感信息的加解密

开心一刻 出门扔垃圾,看到一大爷摔地上了 过去问大爷:我账户余额 0.8,能扶你起来不 大爷往旁边挪了挪 跟我说到:孩子,快,你也躺下,这个来钱快! 我没理大爷,径直去扔了垃圾 然后飞速的躺在了大爷旁边,说道:感觉大爷带飞!书接上回 通过 异构数据源同步之数据同步 → …

开源工作流设计器(流程设计器)哪个好

本文重点介绍,基于activiti、flowable、camunda开源工作流引擎,如何选择一个开源免费的流程设计器,进行集成和扩展开发,快速交付项目使用。大家在开发OA办公自动化、ERP、CRM、BPM、低代码平台等项目的时候,经常用到流程引擎,目前主流的开源流程引擎有activiti、flowable…

如何设计应用系统的数据权限管理

在开发应用系统时,都离不开权限的设计,权限设计 = 功能权限 + 数据权限。而功能权限,在业界常常是基于RBAC(Role-Based Access Control)的一套方案。而数据权限,则根据不同的业务场景,则权限设计不尽相同,可以有不同的技术解决方案。按照应用系统权限类型划分,可进一步…

【进阶篇】一文搞清楚网页发起 HTTP 请求调用的完整过程

最近笔者在实际项目开发中会频繁涉及到服务之间的远程调用、域名的配置和请求的转发等与计算机网络相关的知识。这些其实在读本科和考研的时候都有学习过理论,但为了更透彻地掌握便于在工作中使用,我还是决定写一篇文章来分享实际开发中是怎么应用的。目录前言一、HTTP协议1.…