漫谈 module caching——PyCharm jupyter notebook 在导入模块被更新后无法及时同步问题

目录

  • 引子:问题的发现
  • 何为 module caching
  • 见微知著:Python 中的缓存机制
  • 参考链接

引子:问题的发现

近日笔者用 PyCharm 创建了一个项目时不经意间发现了这个问题:事情发生在调试 Jupyter Notebook 的过程中。当笔者修改了自己编写的某个库函数后,重新运行代码时却发现,Notebook 仍然调用的是修改前的旧版本库函数。经过查阅大量资料和反复测试,终于弄清楚,问题的根源在于 Python 自带的模块缓存机制。笔者也发现,国内资源中对于这一问题也没有过多详细的解释,因此决定写下此文,以供遇到相同问题的读者们参考,也欢迎大家提出建议。

何为 module caching

(这一部分可以在 PyCharm 中动手实验,本人所用版本为 2024.3 专业版。)

我们新建一个项目,其中创建两个文件:

```a.py```
def echo():
    print(1)
```b.ipynb```
from EM.a import echo
echo()

运行 b.ipynb, 如我们所料,程序正常输出了 1. 但假如我们改动 a.py 中函数的输出,将打印的 1 改为 2 并保存,照理来说重新运行 b.ipynb 应该会重新导入一遍这个新的函数吧?但实际运行发现,调用的函数仍然是老版本的,其输出为 1.
此处仍然是老的 echo 函数这便是所谓的,‘module caching’(模块缓存),即当 kernel 尚未重启时,重新运行所有的 cell 并不会从文件目录(硬盘)中再调用一遍改动后的模块函数。相反,系统会优先使用内存中已有的一份缓存副本。这种机制的设计极大地提高了模块调用的效率,因为避免了频繁的文件 I/O 操作。然而,也正是这个机制导致了上文中提到的模块未完全更新的问题,在此需要多多注意。经过笔者的反复搜寻,发现有这么两种解决方案:

  1. 每次运行所有 cell 之前先重启 kernel
    其实如果读者熟悉浏览器形式的 jupyter notebook, 会发现工具栏的 >> 按钮和 PyCharm 含义有且仅有一点差别——jupyter notebook 上是 ‘restart the kernel and run all cells’, 而 PyCharm 上则只是 ‘run all cells’。虽然 PyCharm 自身也有 ‘restart kernel’ 的按钮,但如果不想按两次,可以点击右上角的浏览器图标,在浏览器中打开 .ipynb 文件。当然,由于笔者对 PyCharm 的 UI 并不是那么熟悉,如果有读者知道更改按钮设定 / 一次性快捷完成这两项操作的方法,欢迎在评论区留言分享。
  2. 使用 importlib 中的 reload 函数
    当然,万能的 Python 总是能给我们提供奇妙的库函数来解决问题。这里用到的函数是 importlib 库中的 reload 函数,能够强制在同一进程下从硬盘中重新获取更新后的库文件,并在下一次调用时使用更新后的函数。具体操作方法如下:
    ```b.ipynb```
    from importlib import reload
    import EM.a
    reload(EM.a)	# 重新加载模块
    from EM.a import echo	# 加载后导入需要的函数
    echo()
    

见微知著:Python 中的缓存机制

事实上,上述所说的缓存机制只是 python 中的一种。而 python 的缓存按范围可以分为两类:单进程中的缓存机制进程之间的缓存机制。虽然我们平时只需一下 Ctrl+F5 就能保存并重新运行一个 .py 文件,但前后两次运行是两个不同的进程。而到了 .ipynb 的 notebook 文件中,重新运行 cell 而不重启 kernel 实际上还是留在原来的老进程中(这点从我们在 cmd 输入 jupyter notebook 后只要不重启 kernel 命令行就不会断这一事实也不难看出)。这一分类下,其实我们刚才提到的缓存属于第一类

  • 单进程:具体来说,每当你在同一进程中使用 import 语句导入某个模块时,Python 不会重复加载该模块的内容,而是直接从全局字典(sys.modules)中获取对应的模块对象。这种设计不仅提升了运行效率,避免了重复的磁盘 I/O 操作,还确保了模块在进程中的状态得以持久化。
  • 进程间:多个解释器进程加载相同的 Python 模块时,在第一次加载时,Python 会将 .py 源代码编译为包含字节码的 .pyc 文件。这一操作只需进行一次,因此后续的进程无需重新解析 .py 文件,加载速度会快上不少。这种机制在安装新库时尤为显著。例如,当我们使用工具安装一个 Python 库时,系统会自动生成 .pyc 文件,从而优化后续的模块调用效率。

参考链接

  • https://stackoverflow.com/questions/2918898/prevent-python-from-caching-the-imported-modules
  • https://stackoverflow.com/questions/29353600/ipython-notebook-caching-issue
  • https://www.reddit.com/r/Python/comments/140c9z9/does_python_cache_package_imports/

欢迎关注我的博客!
Find me on GitHub: GitHub profile page
Gitee account (under construction): Gitee site
GitLab account (under construction): GitLab site
Also find me on Luogu:Luogu profile

欢迎大家关注我,在项目上与我协作哦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业数字化转型现状

国家数字经济战略背景 2018年以来,国家政府不断出台政策规范我国企业数字化治理市场。2018年9月颁布《关于发展数字经济稳定并扩大就业的指导意见》,支持建设一批数字经济创新创业孵化机构。积极推进供应链创新与应用,支持构建以企业为主导。…

《Python基础》之算数、比较、赋值、逻辑、位运算符

目录 简介 Python中常见的运算符 1、算数运算符 2、比较运算符 3、赋值运算符 4、逻辑运算符 5、位运算符 总结 简介 Python 提供了多种运算符,用于执行各种操作,包括算术运算、比较运算、逻辑运算、位运算、赋值运算等。以下是 Python 中常用的…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshPhongMaterial高…

【CSP CCF记录】201809-2第14次认证 买菜

题目 样例输入 4 1 3 5 6 9 13 14 15 2 4 5 7 10 11 13 14 样例输出 3 思路 易错点:仅考虑所给样例,会误以为H和W两人的装车时间是一一对应的,那么提交结果的运行错误就会让你瞬间清醒。 本题关键是认识到H和W的装车时间不一定一一对应&…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中,科技的力量正日益凸显。其中,移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能,成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式,更为农业生产带来了高效、精…

【PCB设计】AD16教程:分配位号

1、前提条件 确保已经基本画完原理图 2、点击【Tools-Annotate Schematics】 3、依次点击【Reset All】、【Update Changes Lise】、【Close】 最后位号就被自动分配好了

20241125编译友善之臂的NanoPi R3S开发板【RK3566】STEP-BY-STEP版本

20241125编译友善之臂的NanoPi R3S开发板【RK3566】STEP-BY-STEP版本 2024/11/25 15:59 20241125编译友善之臂的NanoPi R3S开发板【RK3566】精简步骤 2024/11/25 19:37 viewproviewpro-ThinkBook-16-G5-IRH:~$ viewproviewpro-ThinkBook-16-G5-IRH:~$ df -h viewproviewpro-T…

uniapp实际开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案: 在manifest.json文件,找到开源码视图配置,添加如下: "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

计算机网络:应用层知识点概述及习题

网课资源: 湖科大教书匠 1、概述 习题1 1 在计算机网络体系结构中,应用层的主要功能是 A. 实现进程之间基于网络的通信 B. 通过进程之间的交互来实现特定网络应用 C. 实现分组在多个网络上传输 D. 透明传输比特流 2 以下不属于TCP/IP体系结构应用层范畴…

数据治理:在企业数据管理中的关键角色与实现路径——《DAMA 数据管理知识体系指南》读书笔记- 第 3 章

文章目录 1. 数据治理的核心内涵与战略价值2. 数据治理的驱动因素:不仅仅是合规3. 数据治理的组织模型:选择适合企业结构的运营模式4. 实施数据治理的关键步骤:战略、制度和文化5. 数据治理工具的选择:支持业务与流程的高效管理6.…

递推概念和例题

一、什么是递推 递推算法以初始值为基础,用相同的运算规律,逐次重复运算,直至求出问题的解,它的本质是按照固定的规律逐步推出(计算出)下一步的结果 这种从“起点”重复相同的的方法直至到达问题的解&…

【Android】RecyclerView回收复用机制

概述 RecyclerView 是 Android 中用于高效显示大量数据的视图组件&#xff0c;它是 ListView 的升级版本&#xff0c;支持更灵活的布局和功能。 我们创建一个RecyclerView的Adapter&#xff1a; public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerVie…

websocket是什么?

一、定义 Websocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;它允许服务器主动向客户端推送数据&#xff0c;而不需要客户端不断的轮询服务器来获取数据 与http协议不同&#xff0c;http是一种无状态的&#xff0c;请求&#xff0c;响应模式的协议(单向通信)&a…

已存大量数据的mysql库实现主从各种报错----解决方案

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建&#xff0c;使…

SAP 零售方案 CAR 系统的介绍与研究

前言 当今时代&#xff0c;零售业务是充满活力和活力的业务领域之一。每天&#xff0c;由于销售运营和客户行为&#xff0c;它都会生成大量数据。因此&#xff0c;公司迫切需要管理数据并从中检索见解。它将帮助公司朝着正确的方向发展他们的业务。 这就是为什么公司用来处理…

模电复习易错题

PN 结&#xff1a;PN 结是由 P 型半导体和 N 型半导体通过特殊工艺结合在一起形成的结构。P 型半导体中多子是空穴&#xff0c;N 型半导体中多子是电子。内建电场&#xff1a;在 PN 结形成时&#xff0c;由于 P 区和 N 区载流子浓度的差异&#xff0c;会在结区形成一个内建电场…

AI安全:从现实关切到未来展望

近年来&#xff0c;人工智能技术飞速发展&#xff0c;从简单的图像识别到生成对话&#xff0c;从自动驾驶到医疗诊断&#xff0c;AI技术正深刻改变着我们的生活。然而&#xff0c;伴随着这些进步&#xff0c;AI的安全性和可控性问题也日益凸显。这不仅涉及技术层面的挑战&#…

nfs网络文件系统

NFS(Network File system&#xff0c;网络文件系统)是由SUN公司研制的UNIX表示层协议&#xff0c;它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源&#xff0c;主要在unix系列操作系统上使用。在NFS的应用中&#xff0c;本地NFS的客户端应用可以…

mac终端配置-支持 git branch

mac 终端一般使用的是 zsh&#xff1b; 由于不想安装三方的软件&#xff0c;可以自行编写脚本实现一些效果&#xff1b; 最终效果如下&#xff0c;支持显示git 分支&#xff1a; git_branch(){branch"git branch 2>/dev/null | grep "^\*" | sed -e "…

tableau练习-制作30个图表

一、导入数据 1、导入数据 -添加-添加连接-到文件-excel格式用第一个excel导入&#xff0c;csv格式用第二个文本格式导入 2、连接数据 -从旁边这里直接拖到中间 标头连接 -日期若不一致需调节日期格式 3、保存数据 点击数据提取-再保存数据&#xff0c;保存为twbx格式 二、设计…