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

OneNote | OneNote 当前无法同步笔记。将继续尝试。 (错误代码: 0xE4020045) OneNote同步问题: 0xE4020045缘由问题分析解决官方blabla:私人解决方法 缘由 多个平台之间同步,打算将某个笔记本上同步到drive上笔记本在另一台电脑上打开(其实所有笔记本都是这个操作,只是这个一直忘了打开) 然后按照常规操作,右键打开笔记本,然后又是从笔记本选,又是从文件夹选,不是无法读取,就是打开了是空白的,是下面这种情况: 问题 OneNote 当前无法同步笔记。将继续尝试。 (错误代码: 0xE4020045) 分析 OneNote的同步问题一直遭到诟病,之前遇到过这个情况 阅读详情

引子:问题的发现

近日笔者用 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 文件,从而优化后续的模块调用效率。

参考链接


欢迎关注我的博客!
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

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

jupyter notebook 自动更新导入的自定义模块 ref一日一技:在 Jupyter 中如何自动重新导入特定的 模块?当自定义模块的功能逻辑发生变化时,运行中的jupyter notebook不会自动导入已更新过的模块,它只会保留最先运行时的模块解决办法:手动控制重新导入,作用当前所在Cell,因此不是很方便自动重新导入特定模块,作用整个ipynb,要求放在第一次使用该模块之前第1行启动autoreload机制。第2行,设置自动加载通过%aimport导入的模块。第3行使用%aimport导入analyze模块。自动重新导入所有模块。...... 阅读详情

相关推荐

UOS的ARM机编译QT5.14.2记录

我需要的qt版本是Qt5.14.2,所以选择编译Qt5.14.2源码;几个月前尝试了编译一次,当时编译过程中出现了报错,当时时间很紧最后安装的默认版本来使用,最近有时间重新进行了一次编译,历经3个星期(4G的内存)终于解决了各种坑,编译成功了,现在将编译过程中遇见的一些坑记录一下,方便日后能记得这一次可恶的编译过程,如有描述欠缺的地方,还希望各位大佬给点意见指导指导🙏。

NiF693zzz的博客 1617

jupyter notebook使用记录

jupyter notebook使用记录 一、设置工作目录 方法一:打开jupyter快捷方式属性,在“目标”把%USERPROFILE%删除,而后与前边内容空一格用英文双引号引住需要修改的工作目录。例如: “D:\notebook_dir” 方法二:命令行输入jupyter notebook --generate-config,打开C:\Users\ligx1.jupyter\jupyter_notebook_config.py,找到c.NotebookApp.notebook_dir = ‘此处添加路径

优快云lgx的博客 1803

奇迹mu服务端DATA文件解析:从基础配置到高级玩法

本文深入解析奇迹MU服务端DATA文件的核心配置与高级玩法,涵盖基础设置、怪物AI系统、技能战斗机制、副本事件管理及物品商城定制。通过详细示例和实用技巧,帮助开发者掌握从经验倍率调整到动态事件触发的全方位配置方法,实现个性化的私服搭建与运营。

weixin_29254673的博客 529

git解决jupyter notebook同步问题

在本地和远端服务器同步中,如果直接上传修改,jupyter notebook会出现无法打开的问题 原因: git中如果出现修改,会有>>>>>git 的问题。而.ipynb内核主要是json文件,jupyter notebook通过解析json文件来显示页面,如果出现先了>>>>>这样的标签,会导致内核无法解析文件。 解决方法: 1.直接git clone 2.如果代码没有改变,只是每次运行的输出变了,我们可以在上传前先清除单元格所有输出再使用gi

IRONFISHER的博客 1822

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 203

Matlab实战:手把手教你用Zernike多项式模拟光学像差(附完整代码)

本文详细介绍了如何在Matlab中使用Zernike多项式模拟光学像差,包括基础理论、不同排序系统的实现、完整代码示例以及高级应用技巧。通过Zernike多项式,可以有效地描述和分析光学系统中的波前畸变,适用于望远镜校正、眼科光学等多个领域。

weixin_42523720的博客 160

解决 Jupyter Notebook 中本地模块修改不生效的问题

当你在 Jupyter Notebook 中导入本地目录的库,修改后重新运行 `import` 语句却发现修改没有生效,这是因为 Python 的模块缓存机制。Python 解释器会将已导入的模块缓存在 `sys.modules` 字典中,再次导入时会直接使用缓存版本而不会重新读取文件,以提高性能。

kanhao100的博客 1508

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 343

jupyter 不能及时更新第三方包中的内容

点赞和关注是我创作的最大动力~~ 一直用 pycharm 专业版来写 python 代码,今天使用的时候发现一个问题,我把一个 main.ipynb 文件作为主文件,中间导入了其他的 .py 文件,也就是导入了自己写的包,如下: import numpy import abc 其中,abc 是我自己写的包。但是发现一个问题,当我改写了 abc.py 中的内容想重新运行 main.ipynb 文件时,得到的仍然是未更新的结果。 我以为是 pycharm 的问题,我又使用 jupyterlab 试了一下,发

GISer and Coder 1116

训练救星!EMA多尺度注意力让YOLOv11轻松攻克自定义数据集不涨点难题

在目标检测模型训练中,自定义数据集不涨点是阻碍算法落地的核心痛点之一。传统训练策略在数据分布特殊、样本量有限的场景下极易陷入收敛停滞,而 EMA(指数移动平均)结合多尺度注意力的方案,在自定义数据集上实现mAP 提升 6.5%,同时让训练曲线从“平缓停滞”转为“持续攀升”,彻底解决创新点在自有数据上的性能瓶颈。本教程将带你从原理到实践,通过 EMA 多尺度注意力为 YOLOv11 注入训练稳定性,让你的自定义数据集模型训练实现质的飞跃。EMA 衰减率:小样本数据集建议将decay。

FJN110的博客 160

Redhawk:toggle rate从哪来?

redhwak中toggle rate的相关设置

m0_61544122的博客 8110

jupyter notebook中执行过程中更新模块代码,再执行没有更新执行

1、排查方法当环境中有多个同名文件,需要确定模块文件和更新文件是不是同一个文件。如何知道现在系统中默认引用的是哪个目录下的base.py比如要知道当前系统中引用的base.py文件的路径,可以使用属性查看模块的实际加载路径。

sinc00的专栏 521

基于 STM32 的乒乓球发球机控制系统设计与实现

乒乓球发球机是一种能够按照预设参数自动、连续发出乒乓球的训练设备。本系统以 STM32F103C8T6 为主控核心,通过控制实现球速调节、实现落点与旋转方向控制、实现出球节奏控制,并配合 OLED 显示与按键人机交互,实现速度、频率、落点、旋转四大参数的可调发球训练。

weixin_42300449的博客 209

解决jupyter模块实时更新问题%load_ext autoreload &%autoreload 2

解决jupyter模块实时更新问题%load_ext autoreload &%autoreload 2

m0_52330652的博客 1725

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

日报 2 | jupyter&pycharm

jupyter notebook修改原始路径和pycharm使用anaconda环境下的库

w25429696的博客 565

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python导入自定义函数库时将函数库修改了重新导入为什么无法得到修改后函数

比如有一个自定义函数库func.py,如果已经导入了这个库,此时在里面新添加了一个func1函数,然后重新运行from func import *代码,但是仍然无法使用新添加的函数func1。上面的代码跑一边应该就可以解决问题。

m0_56744512的博客 236

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何释放jupyter notebook占用的内存

这学期下载了Anaconda,用这个运行jupyter notebook。 期末大作业做完以后,发现我d盘内存只剩100m左右了(因为Anaconda是下载在d盘的)。因为我在运行命令的时候,总是全部输出,导致内存被大量占用。想问问怎么能释放这些内存啊?实在不行,直接删掉整个Anaconda能释放吗? 谢谢大家! PS:做作业之前,大概还剩40-50g内存! 本人女生一枚,真的不太搞得来电脑。如果大家觉得我的表述不太清晰,我可以再阐释! ...

compile3的博客 8070

Jupyter Notebook详细教程(下)

实例分析 现在我们已经看了一个 Jupyter Notebook,是时候看看它们在实践中使用了,这应该会让你更清楚地了解它们为什么那么受欢迎。现在是时候开始使用前面提到的财富 500 数据集了。请记住,我们的目标是了解美国最大公司的利润在历史上是如何变化的。 值得注意的是,每个人都会有自己的喜好和风格,但是一般原则仍然适用,如果你愿意,你可以在自己的 notebook 上跟随这一段,这也给了你自由发挥空间。 命名你的 notebook 在开始编写项目之前,你可能想要给它一个有意义的名称。也许有点让人困惑,你

3238

Jupyter notebook如何更文件存储路径存储地址(实用简单)

目录 一、修改默认存储地址,文件全部存储在一个规定文件夹中 方法一 方法二 优缺点 二、在每次打开时,指定存储路径 优缺点 想来大家都已经安装好了,直接从步骤讲起,简单字少 一、修改默认存储地址,文件全部存储在一个规定文件夹中 方法一 1,在Prompt里面运行jupyter notebook --generate-config,得到文件地址。 jupyter notebook --generate-config 2,输入文件夹搜索框中打开此文件 或者在jupyter..

HuanLiu_Duke的博客 6811

python修改导入包后,jupyter notebook只需重启服务清空输出

文章目录问题原因解决 问题 在jupyter notebook中运行python代码,代码中有一个包是自己编写的,一直在修正,但是每次import都会只保留最原始的版本,而不是最新的版本。 然后每次都得退出jupyter notebook,再重新打开,才能导入最新版本 原因 因为首次导入包时,会有包缓存,再次运行代入代码,其实并没有真正再导入,而只是到包缓存中去取包,因此,这种方式只能取到最旧的包。 解决 重启服务,清空所有缓存,再重新运行代码,导入包。 ...

kakazai.cn 2632

jupyter notebook 用完占着显存不释放解决办法

nvidia-smi 每次用完jupyter ,明明已经退出了,但还是占着显存,用nvidia-smi查看,发现确实pyhton命令还在占着全部显存的进程 找到那个对应的PID, 执行kill命令,比如进程号PID是5186 kill 5186就可以了 ...

xd_wjc的博客 1万+

(亲测有效)修改jupyter notebook的默认存储路径

1.在桌面创建一个jupyter的快捷方式: 2.找到快捷方式,右击——属性;把里面的%USERPROFILE%改掉换成你想要存储的路径(加上英文的双引号) 3.点击应用,确定,重启jupyter notebook即可; 参考:https://blog.youkuaiyun.com/qigenhuochai/article/details/77891003...

测试开发工程师的学习经历 1万+

修改Jupyter notebook默认储存路径教程

修改Jupyter notebook缓存文件路径教程 第一步:打开cmd(home键+R,在搜索框中输入cmd),在我的电脑中找到Scripts这个文件夹; 第二步:如果在cmd中还是显示初始路径,就再输入盘名 + : ; 第三步:在cmd中输入jupyter notebook --generate-config 第四步:上一步操作会得到一个.py文件的绝对路径,在我的电脑中找到那个.py文...

CV的博客 1939

jupyter无法import新包的解决方案

在jupyter模式下写代码的时候,会发现通过pip install package命令行安装package完成之后,无法在jupyter模式下。import package,这点一直很困惑,通过上网搜索,还是找不到原因,或者说大家好像根本觉得这个不是事。 1.首先我们要知道jupyter模式下实用的python编译路径与其他模式下的python编译路径是不一样的 import sys sy...

不曾走远的博客 1万+

jupyter如何重新加载模块

最近几年,jupyter在全球数据科学领域,已经成为不可或缺的重要工具。 在jupyter中用python写程序,若import了自己写的外部模块,如果这个外部模块有更新,再次执行import,jupyter是不会重新导入的。一般的做法是先restart整个jupyter文档,再重新执行代码,以确保所有导入的外部模块都是最新的。但这种做法太麻烦,效率也不高。 网上搜“jupyter auto re...

ybdesire的专栏 1万+

更改jupyter-notebook文件保存位置方法

找到C盘用户路径下的.jupyter文件夹,用记事本打开文件夹中的”jupyter_notebook_config“文件,编辑>查找"c.NotebookApp.notebook_dir"所在行,令c.NotebookApp.notebook_dir =‘E:\Jupyter’<可自行设置保存路径>,并将该行的注释 #去掉。 打开桌面,在开始中找到Jupyter notebook,打开它的文件 位置,选中Jupyter notebook,点击属性,将目标中路径后面双引号部分全部删除即可。.

Big_SHOe的博客 3585
上一篇: 题解系列019 + 比赛系列008 | 优快云 第二十三届编程竞赛题解 + 建议
下一篇: 使用 pyreqs 快速创建 requirements.txt & PyCharm 中 UnicodeDecodeError 问题
爱学习的Allan
博客等级 码龄7年 3444粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值