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

    文章

    2618

    浏览量

    47043
  • 缓存
    +关注

    关注

    1

    文章

    223

    浏览量

    26586
  • python
    +关注

    关注

    53

    文章

    4753

    浏览量

    84111
收藏 人收藏

    评论

    相关推荐

    了解CPU高速缓存

    CPU的核心功能包括数据运算和指令控制。CPU运算的数据和执行的指令全部存储在CPU的寄存器中,这些数据和指令又都来自于CPU高速缓存
    的头像 发表于 01-02 16:01 1333次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>了解CPU高速<b class='flag-5'>缓存</b>

    文理解自举电路原理

    我们从最简单的电路开始点分析,先定义下输入阻抗的计算过程。我们可以粗略的把负载作为个黑盒子来对待,所谓的输入阻抗,就是计算输入到这个黑盒子的电压与电流的比值,比如下图,输入阻
    的头像 发表于 12-18 09:24 1237次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>自举电路原理

    mybatis缓存和二级缓存的原理

    MyBatis是种轻量级的持久化框架,它提供了缓存和二级缓存的机制来优化数据库操作性能。缓存
    的头像 发表于 12-03 11:55 917次阅读

    python如何导入模块

    Python种强大的编程语言,它支持模块化编程,使得开发者可以将代码分解为可重用且独立的模块模块
    的头像 发表于 11-22 14:46 811次阅读

    python调用math函数的方法

    中。本文将详细介绍math模块中的各种数学函数的调用方法,包括函数的功能、参数的使用和返回值的含义等方面,以帮助读者更好地理解和应用这些函数。 、导入math模块 要使用math
    的头像 发表于 11-22 11:01 2185次阅读

    文理解示波器带宽

    当示波器用户选择示波器进行关键的测量时,示波器的主要参数指标往往是选择哪款示波器的唯标准。
    的头像 发表于 11-06 10:37 1599次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>示波器带宽

    如何用Python理解委托模式

    voice 类产生“狗吠 ” 声,这时候就可以采用 委托模式 。下面就用Python理解这个设计模式。 Python里,在委托者类对象中,需要这么设计: 1. 重写__getattr__方法,使得委托者获得处理者的属性。 2
    的头像 发表于 11-02 15:30 492次阅读
    如何用<b class='flag-5'>Python</b>来<b class='flag-5'>理解</b>委托模式

    Python import Hook 实现远程导入模块

    所谓的模块 导入,是指在模块中使用另模块的代码的操作,它有利于代码的复用。 也许你看到这个标题,会说我怎么会发这么基础的文章? 与此
    的头像 发表于 11-02 11:45 535次阅读
    <b class='flag-5'>Python</b> import Hook 实现远程导入<b class='flag-5'>模块</b>

    yfinance:获取数据的Python第三方模块

    yfinance 是个使用 Yahoo! 获取数据的 Python 第三方模块。它支持获取最细到1分钟级的历史数据及股票基本面数据,是免费获得美股分钟级及以上粒度数据的不二之选。 1.准备 开始
    的头像 发表于 10-21 14:32 2025次阅读

    Python 梯度计算模块如何实现个逻辑回归模型

    AutoGrad 是个老少皆宜的 Python 梯度计算模块。 对于初高中生而言,它可以用来轻易计算条曲线在任意个点上的斜率。 对于大
    的头像 发表于 10-21 11:01 427次阅读
    <b class='flag-5'>Python</b> 梯度计算<b class='flag-5'>模块</b>如何实现<b class='flag-5'>一</b>个逻辑回归模型

    Manim:Python数学动画开发模块

    Manim 是3b1b开源的个特别漂亮的数学动画模块。 我们能够基于Manim绘制许多解释性的动画,比如下面这个: 也支持函数图像: 甚至是些3D视图和矩阵变换,Manim都可以轻易实现: 如果
    的头像 发表于 10-17 11:21 1618次阅读
    Manim:<b class='flag-5'>一</b>个<b class='flag-5'>Python</b>数学动画开发<b class='flag-5'>模块</b>

    详解python条件判断

    今天给大家带来python条件判断。
    发表于 10-01 10:48 670次阅读

    详解python循环

    今天给大家带来python循环。
    发表于 10-01 10:48 5625次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>详解<b class='flag-5'>python</b>循环

    详解python调用函数

    函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。但是在 Python 中我们要注意个关键点,就是Python不允许前向引用,即在函数定义之前,不允许调用该函数。
    发表于 10-01 10:45 528次阅读

    LRU缓存模块最佳实践

    lru模块,可以方便地实现LRU缓存。 基础用法 Cargo.toml引入 lru 模块 lru = "0.10.0" 创建个LRU缓存
    的头像 发表于 09-30 16:47 774次阅读