0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文理解python模块的缓存

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-14 16:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在一个模块内部重复引用另一个相同模块,实际并不会导入两次,原因是在使用关键字 import 导入模块时,它会先检索 sys.modules 里是否已经载入这个模块了,如果已经载入,则不会再次导入,如果不存在,才会去检索导入这个模块。

来实验一下,在 my_mod02 这个模块里,我 import 两次 my_mod01 这个模块,按逻辑每一次 import 会一次 my_mod01 里的代码(即打印 in mod01),但是验证结果是,只打印了一次。

$ cat my_mod01.py
print('in mod01')

$ cat my_mod02.py
import my_mod01
import my_mod01

$ python my_mod02.py
in mod01

该现象的解释是:因为有 sys.modules 的存在。

sys.modules 是一个字典(key:模块名,value:模块对象),它存放着在当前 namespace 所有已经导入的模块对象。

# test_module.py

import sys
print(sys.modules.get('json', 'NotFound'))

import json
print(sys.modules.get('json', 'NotFound'))

运行结果如下,可见在 导入后 json 模块后,sys.modules 才有了 json 模块的对象。

$ python test_module.py
NotFound

由于有缓存的存在,使得我们无法重新载入一个模块。

但若你想反其道行之,可以借助 importlib 这个神奇的库来实现。事实也确实有此场景,比如在代码调试中,在发现代码有异常并修改后,我们通常要重启服务再次载入程序。这时候,若有了模块重载,就无比方便了,修改完代码后也无需服务的重启,就能继续调试。

还是以上面的例子来理解,my_mod02.py 改写成如下

# my_mod02.py

import importlib
import my_mod01
importlib.reload(my_mod01)

与上面不同的是,这边执行了两次 my_mod01.py

$ python3 my_mod02.py
in mod01
in mod01

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2848

    浏览量

    53432
  • 缓存
    +关注

    关注

    1

    文章

    248

    浏览量

    27807
  • python
    +关注

    关注

    58

    文章

    4883

    浏览量

    90294
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    京东缓存中间件架构与缓存内核优化

    、京东缓存中间件架构 1、背景 在当今高并发、分布式的系统架构中,缓存已成为提升应用性能、降低数据库负载的核心组件。随着业务规模的扩大与系统复杂度的增加,缓存的使用和管理面临诸多挑战
    的头像 发表于 04-03 16:18 1803次阅读
    京东<b class='flag-5'>缓存</b>中间件架构与<b class='flag-5'>缓存</b>内核优化

    KeepAlive:组件缓存实现深度解析

    理解它的实现原理,将帮助我们更好地处理需要保持状态的组件。 前言:为什么需要组件缓存? 在构建大型单页应用时,我们经常会遇到这样的场景: 用户频繁切换标签页,每次切换回来表单数据却丢失了。 个复杂
    发表于 03-05 19:17

    IoT智能模块高速缓存核心IS61WV204816ALL-12B

    ISSI 32Mbit SRAM IS61WV204816ALL-12B为IoT智能模块提供高速数据缓存,凭借12ns访问速度、1.6V超低功耗及工业级温度范围,确保设备在实时数据处理中的高效可靠运行,显著提升响应速度与续航能力。
    的头像 发表于 02-02 09:57 460次阅读
    IoT智能<b class='flag-5'>模块</b>高速<b class='flag-5'>缓存</b>核心IS61WV204816ALL-12B

    RDMA设计21:连接管理模块设计

    本博主要交流设计思路,在本博客已给出相关博约100篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。 连接管理模块个连接信息
    发表于 01-12 11:03

    RDMA设计14:连接管理模块设计

    本博主要交流设计思路,在本博客已给出相关博130多篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。连接管理模块个连接信息
    发表于 12-30 16:51

    维视智造携手宝鸡文理学院 共建AI产学研新生态 ——人工智能融创现代产学研学院揭牌仪式圆满举行

    2025年12月23日,宝鸡文理学院人工智能融创现代产学研学院揭牌仪式在宝鸡文理学院图书馆801报告厅隆重举行。维视智造作为受邀企业代表,与宝鸡市工信局、科大讯飞、新大陆科技等政府及企业代表共同见证了这重要时刻。
    的头像 发表于 12-25 15:25 300次阅读
    维视智造携手宝鸡<b class='flag-5'>文理</b>学院 共建AI产学研新生态 ——人工智能融创现代产学研学院揭牌仪式圆满举行

    没有专利的opencv-python 版本

    GUI 依赖,且默认禁用 nonfree 专利模块),版本需与核心版致: # 先安装核心版,再安装配套 contrib 无头版(避免专利风险) pip install opencv-python
    发表于 12-13 12:37

    电能表会 “爆表” 吗?机械 / 家用 / 快充桩场景的计量真相拆解

    文理清:为何家用电表难 “爆表”,快充桩却会?
    的头像 发表于 11-12 09:25 3271次阅读
    电能表会 “爆表” 吗?机械 / 家用 / 快充桩场景的计量真相拆解

    文理解模数转换器中的有效位数

    随着测量精度要求提升,有效位数(ENOB)已成为评估ADC、数字示波器真实性能的核心指标。ENOB由IEEE定义,综合了噪声、抖动、非线性失真等误差,反映设备在实际使用中的“有效分辨率”。
    的头像 发表于 10-09 11:01 3314次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>模数转换器中的有效位数

    详解xilinx 7系列FPGA配置技巧

    本文旨在通过讲解不同模式的原理图连接方式,进而配置用到引脚的含义(手册上相关引脚含义有四、五页,通过本文理解基本上能够记住所有引脚含义以及使用场景),熟悉xilinx 7系列配置流程,以及设计原理图时需要注意的些事项,比如flash与FPGA的上电时序。
    的头像 发表于 08-30 14:35 1.1w次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>详解xilinx 7系列FPGA配置技巧

    缓存之美:万详解 Caffeine 实现原理(上)

    文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍,首先会讲解它的实现原理,在大家对它有个概念之后再深入具体源码的细节之中,理解它的设计理念,从中能学习到
    的头像 发表于 08-05 14:49 801次阅读
    <b class='flag-5'>缓存</b>之美:万<b class='flag-5'>文</b>详解 Caffeine 实现原理(上)

    高性能缓存设计:如何解决缓存伪共享问题

    在多核高并发场景下, 缓存伪共享(False Sharing) 是导致性能骤降的“隐形杀手”。当不同线程频繁修改同缓存行(Cache Line)中的独立变量时,CPU缓存
    的头像 发表于 07-01 15:01 877次阅读
    高性能<b class='flag-5'>缓存</b>设计:如何解决<b class='flag-5'>缓存</b>伪共享问题

    由 Mybatis 源码畅谈软件设计(八):从根上理解 Mybatis 二级缓存

    1. 验证二级缓存 在上篇帖子中的 User 和 Department 实体类依然要用,这里就不再赘述了,要启用二级缓存,需要在 Mapper.xml 文件中指定 cache 标签,如下
    的头像 发表于 06-23 11:35 569次阅读
    由 Mybatis 源码畅谈软件设计(八):从根上<b class='flag-5'>理解</b> Mybatis 二级<b class='flag-5'>缓存</b>

    MCU缓存设计

    MCU 设计通过优化指令与数据的访问效率,显著提升系统性能并降低功耗,其核心架构与实现策略如下: 缓存类型与结构 指令缓存(I-Cache)与数据缓存(D-Cache)‌ I-Ca
    的头像 发表于 05-07 15:29 1266次阅读

    Nginx缓存配置详解

    Nginx 是个功能强大的 Web 服务器和反向代理服务器,它可以用于实现静态内容的缓存缓存可以分为客户端缓存和服务端缓存
    的头像 发表于 05-07 14:03 1377次阅读
    Nginx<b class='flag-5'>缓存</b>配置详解