什么是 Python 中的 __pycache__ 文件夹?
off999 2024-10-12 06:17 70 浏览 0 评论
当您开发一个独立的 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 IDE 和代码编辑器在开箱配置时都会隐藏 __pycache__ 文件夹,即使这些文件夹存在于您的文件系统中。
简而言之:它让导入 Python 模块变得更快
尽管 Python 是一种解释型编程语言,但它的解释器并不直接对 Python 代码进行操作,因为那样会非常慢。相反,当您运行一个 Python 脚本或导入一个 Python 模块时,解释器会将您的高级 Python 源代码编译成字节码,字节码是代码的中间二进制表示形式。
这种字节码能让解释器跳过重复的步骤,比如将代码编入抽象语法树并进行解析,以及在每次运行相同程序时验证其正确性。只要底层源代码没有改变,Python 就能重复使用中间表示,并立即准备执行。这样可以节省时间,加快脚本的启动速度。
请记住,虽然从 __pycache__ 加载编译过的字节码会使 Python 模块的导入速度更快,但这并不影响它们的执行速度!
为什么要使用字节码,而不是直接将代码编译成底层机器码?虽然机器码可以在硬件上执行,提供极致的性能,但它的可移植性和生成速度都不如字节码。
机器码是一组能被特定 CPU 架构理解的二进制指令,根据操作系统的不同,被封装成 EXE、ELF 或 Mach-O 等容器格式。相比之下,字节码提供了一个与平台无关的抽象层,编译速度通常更快。
Python 使用本地的 __pycache__ 文件夹来存储项目中导入模块的编译字节码。在随后的运行中,解释器将尝试从这些文件夹中加载模块的预编译版本,前提是它们与相应的源文件是最新的。请注意,只有在代码中导入模块而不是在终端中作为脚本执行时,才会触发这种缓存机制。
除了磁盘上的字节码缓存外,Python 还保留了一个内存中的模块缓存,您可以通过 sys.modules 字典访问它。它确保当您在程序的不同位置多次导入同一个模块时,Python 将使用已经导入的模块,而无需重新加载或重新编译。这两种机制共同作用,减少了导入 Python 模块的开销。
接下来,您将了解在导入模块时,Python 加载缓存字节码比编译源代码快多少。
从缓存加载模块的速度有多快?
缓存发生在幕后,通常不会被注意到,因为 Python 编译字节码的速度非常快。此外,除非您经常运行短时 Python 脚本,否则编译步骤与总执行时间相比仍然微不足道。尽管如此,如果没有缓存,如果您有很多模块并多次导入它们,那么与字节码编译相关的开销就会增加。
要测量缓存模块和未缓存模块的导入时间差,可以在 python 命令中传递 -X importtime 选项,或设置等效的 PYTHONPROFILEIMPORTTIME 环境变量。启用该选项后,Python 将显示一个表格,总结导入每个模块所需的时间,包括一个模块依赖于其他模块时的累计时间。
假设你有一个 calculator.py 脚本,它从本地 arithmetic.py 模块导入并调用了一个实用程序函数:
from arithmetic import add
add(3, 4)导入的模块只定义了一个函数:
def add(a, b):
return a + b如您所见,主脚本将 3 和 4 这两个数字的加法运算委托给了从算术模块导入的 add() 函数。
注意:即使你使用from..import语法,它只是将指定的符号导入到当前的命名空间中,Python将读取并编译整个模块。此外未使用导入也会触发编译。
第一次运行脚本时,Python编译并保存你导入的模块的字节码到一个本地的__pycache__文件夹中。如果这样的文件夹不存在,那么Python会继续之前自动创建一个。现在当您再次执行脚本时,只要您没有更改相关的源代码,Python就应该能找到并加载缓存的字节码。
__pycache__文件夹里面有什么?
__pycache__文件夹中包含了模块的缓存版本,这些版本以.pyc文件的形式存储。.pyc文件是Python字节码的二进制表示形式,它们包含了模块的编译后的形式。
Python何时创建缓存文件夹?
Python在导入模块时会自动检查是否需要创建__pycache__文件夹。如果Python解释器有权限在当前目录下创建文件夹,且该目录下有Python源代码文件,则Python会自动生成__pycache__文件夹并在其中存储相应的缓存版本。
什么操作会使缓存失效?
缓存版本的生成是根据源代码文件的修改时间和内容进行的。如果源代码文件发生了更改,Python将重新生成缓存版本。因此,以下操作将使缓存失效:
- 修改了源代码文件。
- 从一个Python版本切换到另一个Python版本。
- 在不同的操作系统上运行相同的代码。
删除缓存文件夹是否安全?
是的,删除__pycache__文件夹通常是安全的。Python会在需要时自动重新生成缓存版本。删除缓存文件夹可能会导致稍微延迟一点,因为Python需要重新编译源代码以生成新的缓存版本,但不会对代码的正确性产生任何影响。
如何递归删除所有缓存文件夹?
你可以使用操作系统提供的命令或Python的第三方库来递归删除所有的__pycache__文件夹。例如,在Unix/Linux系统上,你可以使用find命令:
find . -type d -name '__pycache__' -exec rm -r {} +
或者
import shutil
import os
def remove_pycache(folder):
for root, dirs, files in os.walk(folder):
for d in dirs:
if d == '__pycache__':
shutil.rmtree(os.path.join(root, d))
remove_pycache('.')
如何防止Python创建缓存文件夹?
如果你不希望Python创建__pycache__文件夹,你可以在运行Python脚本时设置环境变量PYTHONDONTWRITEBYTECODE为1。
export PYTHONDONTWRITEBYTECODE=1
或者
import sys
sys.dont_write_bytecode = True
如何将缓存存储在集中的文件夹中?
如果你希望将所有缓存文件存储在一个集中的文件夹中,而不是在每个模块所在的目录中创建__pycache__文件夹,你可以设置环境变量PYTHONDONTWRITEBYTECODE为一个特定的目录路径。
export PYTHONDONTWRITEBYTECODE=/path/to/cache/folder
缓存的.pyc文件里面是什么?
缓存的.pyc文件包含了模块的编译后的字节码。这些字节码是由Python编译器生成的,可以直接由Python虚拟机执行。
如何读取和执行缓存的字节码?
你可以使用Python的importlib模块来读取和执行缓存的字节码。以下是一个简单的示例:
import importlib.util
# Load cached bytecode
spec = importlib.util.spec_from_file_location("module_name", "/path/to/module.pyc")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Use the module
module.some_function()
字节码能够混淆Python程序吗?
虽然缓存的字节码不是为了隐藏代码而设计的,但它们确实可以使源代码不易被直接阅读。然而,这并不等同于真正的代码混淆或加密。如果你需要确保代码的安全性,最好使用专门的代码混淆工具。
如何反汇编缓存的字节码?
你可以使用Python标准库中的dis模块来反汇编缓存的字节码。以下是一个示例:
import dis
# Disassemble cached bytecode
with open("/path/to/module.pyc", "rb") as f:
dis.dis(f.read())
结论
__pycache__文件夹是Python中用于存储模块缓存版本的特殊文件夹。它可以提高模块导入的速度,并且在大型项目中尤其有用。虽然删除缓存文件夹通常是安全的,但你也可以通过设置环境变量来控制Python是否生成缓存文件夹,以及它们的存储位置。最后,虽然缓存的字节码可以使源代码不易被直接阅读,但它们并不等同于真正的代码混淆或加密,如果需要确保代码的安全性,最好使用专门的工具。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
