0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文理解python模塊的緩存

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-14 16:42 ? 次閱讀

在一個(gè)模塊內(nèi)部重復(fù)引用另一個(gè)相同模塊,實(shí)際并不會導(dǎo)入兩次,原因是在使用關(guān)鍵字 import 導(dǎo)入模塊時(shí),它會先檢索 sys.modules 里是否已經(jīng)載入這個(gè)模塊了,如果已經(jīng)載入,則不會再次導(dǎo)入,如果不存在,才會去檢索導(dǎo)入這個(gè)模塊。

來實(shí)驗(yàn)一下,在 my_mod02 這個(gè)模塊里,我 import 兩次 my_mod01 這個(gè)模塊,按邏輯每一次 import 會一次 my_mod01 里的代碼(即打印 in mod01),但是驗(yàn)證結(jié)果是,只打印了一次。

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

$ cat my_mod02.py
import my_mod01
import my_mod01

$ python my_mod02.py
in mod01

該現(xiàn)象的解釋是:因?yàn)橛?sys.modules 的存在。

sys.modules 是一個(gè)字典(key:模塊名,value:模塊對象),它存放著在當(dāng)前 namespace 所有已經(jīng)導(dǎo)入的模塊對象。

# test_module.py

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

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

運(yùn)行結(jié)果如下,可見在 導(dǎo)入后 json 模塊后,sys.modules 才有了 json 模塊的對象。

$ python test_module.py
NotFound

由于有緩存的存在,使得我們無法重新載入一個(gè)模塊。

但若你想反其道行之,可以借助 importlib 這個(gè)神奇的庫來實(shí)現(xiàn)。事實(shí)也確實(shí)有此場景,比如在代碼調(diào)試中,在發(fā)現(xiàn)代碼有異常并修改后,我們通常要重啟服務(wù)再次載入程序。這時(shí)候,若有了模塊重載,就無比方便了,修改完代碼后也無需服務(wù)的重啟,就能繼續(xù)調(diào)試。

還是以上面的例子來理解,my_mod02.py 改寫成如下

# my_mod02.py

import importlib
import my_mod01
importlib.reload(my_mod01)

與上面不同的是,這邊執(zhí)行了兩次 my_mod01.py

$ python3 my_mod02.py
in mod01
in mod01

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2613

    瀏覽量

    47010
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    223

    瀏覽量

    26579
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84077
收藏 人收藏

    評論

    相關(guān)推薦

    了解CPU高速緩存

    CPU的核心功能包括數(shù)據(jù)運(yùn)算和指令控制。CPU運(yùn)算的數(shù)據(jù)和執(zhí)行的指令全部存儲在CPU的寄存器中,這些數(shù)據(jù)和指令又都來自于CPU高速緩存
    的頭像 發(fā)表于 01-02 16:01 ?1311次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>了解CPU高速<b class='flag-5'>緩存</b>

    文理解自舉電路原理

    我們從最簡單的電路開始點(diǎn)點(diǎn)分析,先定義下輸入阻抗的計(jì)算過程。我們可以粗略的把負(fù)載作為個(gè)黑盒子來對待,所謂的輸入阻抗,就是計(jì)算輸入到這個(gè)黑盒子的電壓與電流的比值,比如下圖,輸入阻
    的頭像 發(fā)表于 12-18 09:24 ?1158次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>自舉電路原理

    mybatis緩存和二級緩存的原理

    MyBatis是種輕量級的持久化框架,它提供了緩存和二級緩存的機(jī)制來優(yōu)化數(shù)據(jù)庫操作性能。緩存
    的頭像 發(fā)表于 12-03 11:55 ?891次閱讀

    python如何導(dǎo)入模塊

    Python種強(qiáng)大的編程語言,它支持模塊化編程,使得開發(fā)者可以將代碼分解為可重用且獨(dú)立的模塊模塊
    的頭像 發(fā)表于 11-22 14:46 ?798次閱讀

    python調(diào)用math函數(shù)的方法

    中。本文將詳細(xì)介紹math模塊中的各種數(shù)學(xué)函數(shù)的調(diào)用方法,包括函數(shù)的功能、參數(shù)的使用和返回值的含義等方面,以幫助讀者更好地理解和應(yīng)用這些函數(shù)。 、導(dǎo)入math模塊 要使用math
    的頭像 發(fā)表于 11-22 11:01 ?2100次閱讀

    文理解示波器帶寬

    當(dāng)示波器用戶選擇示波器進(jìn)行關(guān)鍵的測量時(shí),示波器的主要參數(shù)指標(biāo)往往是選擇哪款示波器的唯標(biāo)準(zhǔn)。
    的頭像 發(fā)表于 11-06 10:37 ?1580次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文理解</b>示波器帶寬

    如何用Python理解委托模式

    voice 類產(chǎn)生“狗吠 ” 聲,這時(shí)候就可以采用 委托模式 。下面就用Python理解這個(gè)設(shè)計(jì)模式。 Python里,在委托者類對象中,需要這么設(shè)計(jì): 1. 重寫__getattr__方法,使得委托者獲得處理者的屬性。 2
    的頭像 發(fā)表于 11-02 15:30 ?480次閱讀
    如何用<b class='flag-5'>Python</b>來<b class='flag-5'>理解</b>委托模式

    Python import Hook 實(shí)現(xiàn)遠(yuǎn)程導(dǎo)入模塊

    所謂的模塊 導(dǎo)入,是指在個(gè)模塊中使用另個(gè)模塊的代碼的操作,它有利于代碼的復(fù)用。 也許你看到這個(gè)標(biāo)題,會說我怎么會發(fā)這么基礎(chǔ)的文章? 與此
    的頭像 發(fā)表于 11-02 11:45 ?533次閱讀
    <b class='flag-5'>Python</b> import Hook 實(shí)現(xiàn)遠(yuǎn)程導(dǎo)入<b class='flag-5'>模塊</b>

    yfinance:獲取數(shù)據(jù)的Python第三方模塊

    yfinance 是個(gè)使用 Yahoo! 獲取數(shù)據(jù)的 Python 第三方模塊。它支持獲取最細(xì)到1分鐘級的歷史數(shù)據(jù)及股票基本面數(shù)據(jù),是免費(fèi)獲得美股分鐘級及以上粒度數(shù)據(jù)的不二之選。 1.準(zhǔn)備 開始
    的頭像 發(fā)表于 10-21 14:32 ?1976次閱讀

    Python 梯度計(jì)算模塊如何實(shí)現(xiàn)個(gè)邏輯回歸模型

    AutoGrad 是個(gè)老少皆宜的 Python 梯度計(jì)算模塊。 對于初高中生而言,它可以用來輕易計(jì)算條曲線在任意個(gè)點(diǎn)上的斜率。 對于大
    的頭像 發(fā)表于 10-21 11:01 ?418次閱讀
    <b class='flag-5'>Python</b> 梯度計(jì)算<b class='flag-5'>模塊</b>如何實(shí)現(xiàn)<b class='flag-5'>一</b>個(gè)邏輯回歸模型

    Manim:個(gè)Python數(shù)學(xué)動(dòng)畫開發(fā)模塊

    Manim 是3b1b開源的個(gè)特別漂亮的數(shù)學(xué)動(dòng)畫模塊。 我們能夠基于Manim繪制許多解釋性的動(dòng)畫,比如下面這個(gè): 也支持函數(shù)圖像: 甚至是些3D視圖和矩陣變換,Manim都可以輕易實(shí)現(xiàn): 如果
    的頭像 發(fā)表于 10-17 11:21 ?1556次閱讀
    Manim:<b class='flag-5'>一</b>個(gè)<b class='flag-5'>Python</b>數(shù)學(xué)動(dòng)畫開發(fā)<b class='flag-5'>模塊</b>

    詳解python條件判斷

    今天給大家?guī)?b class='flag-5'>python條件判斷。
    發(fā)表于 10-01 10:48 ?661次閱讀

    詳解python循環(huán)

    今天給大家?guī)?b class='flag-5'>python循環(huán)。
    發(fā)表于 10-01 10:48 ?5350次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>詳解<b class='flag-5'>python</b>循環(huán)

    詳解python調(diào)用函數(shù)

    函數(shù)被定義后,本身是不會自動(dòng)執(zhí)行的,只有在被調(diào)用后,函數(shù)才會被執(zhí)行,得到相應(yīng)的結(jié)果。但是在 Python 中我們要注意個(gè)關(guān)鍵點(diǎn),就是Python不允許前向引用,即在函數(shù)定義之前,不允許調(diào)用該函數(shù)。
    發(fā)表于 10-01 10:45 ?512次閱讀

    LRU緩存模塊最佳實(shí)踐

    lru模塊,可以方便地實(shí)現(xiàn)LRU緩存。 基礎(chǔ)用法 Cargo.toml引入 lru 模塊 lru = "0.10.0" 創(chuàng)建個(gè)LRU緩存
    的頭像 發(fā)表于 09-30 16:47 ?761次閱讀