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

    文章

    2697

    浏览量

    47445
  • 缓存
    +关注

    关注

    1

    文章

    239

    浏览量

    26674
  • python
    +关注

    关注

    56

    文章

    4795

    浏览量

    84654
收藏 人收藏

    评论

    相关推荐

    HTTP缓存头的使用 本地缓存与远程缓存的区别

    HTTP缓存头是组HTTP响应头,它们控制浏览器和中间代理服务器如何缓存网页内容。合理使用HTTP缓存头可以显著提高网站的加载速度和性能,减少服务器的负载。 1. HTTP
    的头像 发表于 12-18 09:41 96次阅读

    文理解多模态大语言模型——下

    /understanding-multimodal-llms   《文理解多模态大语言模型 - 上》介绍了什么是多模态大语言模型,以及构建多模态 LLM 有两种主要方式之:统嵌入
    的头像 发表于 12-03 15:18 123次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>多模态大语言模型——下

    文理解多模态大语言模型——上

    利于中文读者理解的目标,做了删减、重构和意译,并替换了多张不适合中文读者的示意图。 原文地址:https://magazine.sebastianraschka.com/p
    的头像 发表于 12-02 18:29 316次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>多模态大语言模型——上

    缓存之美——如何选择合适的本地缓存

    Guava cache是Google开发的Guava工具包中套完善的JVM本地缓存框架,底层实现的数据结构类似于ConcurrentHashMap,但是进行了更多的能力拓展,包括缓存过期时间设置、
    的头像 发表于 11-17 14:24 274次阅读
    <b class='flag-5'>缓存</b>之美——如何选择合适的本地<b class='flag-5'>缓存</b>?

    文理解2.5D和3D封装技术

    随着半导体行业的快速发展,先进封装技术成为了提升芯片性能和功能密度的关键。近年来,作为2.5D和3D封装技术之间的种结合方案,3.5D封装技术逐渐走向前台。
    的头像 发表于 11-11 11:21 1090次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>2.5D和3D封装技术

    如何实现Python复制文件操作

    Python 中有许多“开盖即食”的模块(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在这篇文章中,你将会看到些用 Python 实现文件复制的特殊
    的头像 发表于 07-18 14:53 416次阅读

    opencv-python和opencv样吗

    样。OpenCV(Open Source Computer Vision Library)是个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV-Python
    的头像 发表于 07-16 10:38 1167次阅读

    python训练出的模型怎么调用

    使用pickle模块 pickle 是Python个内置模块,用于序列化和反序列化Python对象结构。使用 pickle 可以方便地
    的头像 发表于 07-11 10:15 1903次阅读

    使用Python进行自然语言处理

    在探讨使用Python进行自然语言处理(NLP)的广阔领域时,我们首先需要理解NLP的基本概念、其重要性、Python在NLP中的优势,以及如何通过Python实现
    的头像 发表于 07-04 14:40 442次阅读

    请问STM8S105的连续ADC转换模式怎么理解

    10个缓存区,STM8S105;只能对个通道做连续转换并且缓存10个转换结果。??是不是这样理解; 2,如果是上面的理解正确;如果我想在
    发表于 05-14 07:39

    如何使用Python生成四位随机数字

    为了实现这些目标,Python 为我们提供了random() 模块。random() 是个内置的 Python 模块,用于生成随机数。
    的头像 发表于 04-15 12:47 656次阅读

    Python智能家居系统代码介绍

    Python智能家居系统是种基于Python编程语言开发的智能家居控制系统,在现代家庭中得到了越来越广泛的应用。本文将详细介绍Python智能家居系统的代码实现,包括系统的结构与功能
    的头像 发表于 01-25 09:46 1355次阅读

    如何选择合适的本地缓存

    小编最近在使用系统的时候,发现尽管应用已经使用了 redis 缓存提高查询效率,但是仍然有进步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地
    的头像 发表于 01-18 11:19 849次阅读
    如何选择合适的本地<b class='flag-5'>缓存</b>?

    如何使用Python PySNMP模块获取设备指标呢?

    PySNMP 是个跨平台的纯Python SNMP 引擎实现。
    的头像 发表于 01-12 13:59 3099次阅读

    了解CPU高速缓存

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