最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python import模塊的緩存問題解決方案

 更新時間:2021年06月02日 12:12:55   作者:yill_h  
這篇文章主要介紹了Python import模塊的緩存問題解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在使用django開發(fā)的平臺中,支持用戶自定義函數(shù),但是每次用戶進行修改編輯后,該模塊內(nèi)容已更改,然后重新導入該模塊,但是Python 會認為“我已經(jīng)導入了該模塊,不需要再次讀取該文件”,所以更改將無效。

因此,每次更改文件的內(nèi)容時,都必須退出并重新啟動Django。

使用python開發(fā)后臺服務程序的時候,每次修改代碼之后都需要重啟服務才能生效比較麻煩

要解決這個問題,有以下幾種方式:

最簡單、最有效的方法:重新啟動 Django。但是,這也有缺點,特別是丟失了 django名稱空間中存在的數(shù)據(jù)以及其他導入模塊中的數(shù)據(jù)。

對于簡單的情況,可以使用 Python 的​reload()​函數(shù)。在許多情況下,在編輯一個模塊之后使用

​reload()​函數(shù)就足夠滿足需求。

這里主要是介紹第二種方式:

​reload()​是 Python 提供的內(nèi)置函數(shù),在不同的 Python 版本中有不同的表現(xiàn)形式:

在 Python 2.x 中,reload()是內(nèi)置函數(shù)。

在 Python 3.0 - 3.3 中,可以使用imp.reload(module)。

在 Python 3.4 中,imp 已經(jīng)被廢棄,取而代之的是importlib

Python2.7可以直接用reload():

python2 內(nèi)置函數(shù)reload(module)

Python3可以用下面幾種方法:

方法一:基本方法

from imp import reload
reload(module)

方法二:

import imp
imp.reload(module)

方法三:

import importlib
importlib.reload(module)

方法四:

from importlib import reload
reload(module)

說明:

module 必須是已經(jīng)成功導入的模塊

模塊被加載到內(nèi)存以后,更改文件內(nèi)容,已經(jīng)運行的程序不會生效的,可通過reload重新加載。

導入是一個開銷很大的操作。

python中緩存模塊的一些用法

一.問題描述

有時候可能需要緩存一些 成員方法的值, 可能成員方法的計算比較耗時,有時候不希望重復調(diào)用計算該值, 這個時候就可以緩存該值.

查了一下標準庫 有 functools.lru_cache 有一個 lru_cache 可以緩存成員函數(shù)的值,

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author: Frank 
@contact: frank.chang@shoufuyou.com
@file: test_lru_cache.py
@time: 2018/9/8 下午8:55
"""
import time
from functools import lru_cache

class Model:
    @lru_cache(maxsize=10)
    def calculate(self, number):
        print(f'calculate({number}) is  running,', end=' ')
        print('sleep  3s  ')
        time.sleep(3)
        return number * 3

if __name__ == '__main__':

    model = Model()

    for i in range(5):
        print(model.calculate(i))

    for i in range(5):
        print(model.calculate(i))

結果如下:

calculate(0) is  running, sleep  3s 
0
calculate(1) is  running, sleep  3s 
3
calculate(2) is  running, sleep  3s 
6
calculate(3) is  running, sleep  3s 
9
calculate(4) is  running, sleep  3s 
12
0
3
6
9
12

從結果開出來, 第二次計算的時候 , 就沒有計算 而是通過緩存取值, 所以成員方法只計算了一次.

lru_cache 可以指定 max_size 緩存的大小, typed bool 如果為True, 代表不同類型分別緩存. 如果達到max_size 淘汰策略是LRU, LRU是Least Recently Used的縮寫,即最近最少使用,常用于頁面置換算法.

二 第三方的模塊

第三方的模塊cachetools 已經(jīng)提供了很多緩存策略,直接拿來用一下.

來看下面的例子.

1 來看一個緩存成員方法例子

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author: Frank 
@contact: frank.chang@shoufuyou.com
@file: test_cache.py
@time: 2018/9/8 下午12:59
pip install cachetools

https://docs.python.org/3/library/operator.html

緩存成員方法的值 
cachetools  已經(jīng)實現(xiàn)好了, 直接用就可以了. 

"""
from operator import attrgetter
import time
from cachetools import LRUCache,RRCache , cachedmethod

class Model:
    def __init__(self, cachesize):
        self.cache = LRUCache(maxsize=cachesize)

    @cachedmethod(attrgetter('cache'))
    def get_double_num(self, num):
        """ return  2* num"""
        print(f'get_double_num({num})  is running')
        time.sleep(2)
        return num * 2

model = Model(cachesize=10)
print(model.get_double_num(10))
print(model.get_double_num(10))
print(model.get_double_num(10))
print(model.get_double_num(10))
print(model.get_double_num(10))
print(model.get_double_num(10))

結果如下:

get_double_num(10)  is running
20
20
20
20
20
20
Process finished with exit code 0

可以看出, 值計算一次 函數(shù),第二次走的是緩存. 非常好用. 在初始化方法里面構造一個緩存對象, 之后用 cachedmethod 修飾成員函數(shù),同時 用attrgetter(‘cache') 把cache 拿到就可以用了.

實際上 cachetools 實現(xiàn)了很多緩存策略,具體緩存策略可以參考下面的鏈接.

'Cache', 'LFUCache',
'LRUCache',
'RRCache', 'TTLCache',

‘cached', ‘cachedmethod' 這兩個分別用來修飾 函數(shù)和成員方法的.

2 來看一個 緩存函數(shù)

# 緩存 函數(shù)的值
from cachetools import cached
@cached(cache={})
def fib(n):
    print((f'fib({n}) is  running.'))
    return n if n < 2 else fib(n - 1) + fib(n - 2)

for i in range(20):
    print('fib(%d) = %d' % (i, fib(i)))
@cached(cache={})
def fun(n):
    print(f'fun({n}) is runnnig.')
    time.sleep(3)
    return n ** 2

if __name__ == '__main__':
    for _ in range(5):
        print(fun(4))

如果cache = None , 表示不緩存,該計算結果.

結果如下:

fun(4) is runnnig.
16
16
16
16
16

直接導入 cached 里面 傳入一個字典就可以了,用起來也比較方便.

實現(xiàn)分析:

緩存思路大致是一樣的, 首先先把參數(shù)hash 一下生成一個key, 然后看key 是否在自己的緩存里,不在就計算方法(函數(shù)),之后把key和對應value 放到自己的子弟那里面. 如果下一次計算該值,生成一個key 看是否在 自己的字典里面,如果在直接返回即可. 當然這是基本的思路, 里面還有用到 緩存淘汰策略, 多線程是否要加鎖,等比較復雜的問題.

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 7個流行的Python強化學習算法及代碼實現(xiàn)詳解

    7個流行的Python強化學習算法及代碼實現(xiàn)詳解

    目前流行的強化學習算法包括?Q-learning、SARSA、DDPG、A2C、PPO、DQN?和?TRPO。這些算法已被用于在游戲、機器人和決策制定等各種應用中,本文我們將對其做一個簡單的介紹,感興趣的可以學習一下
    2023-01-01
  • Pycharm插件(Grep Console)自定義規(guī)則輸出顏色日志的方法

    Pycharm插件(Grep Console)自定義規(guī)則輸出顏色日志的方法

    這篇文章主要介紹了Pycharm插件(Grep Console)自定義規(guī)則輸出顏色日志的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Python加密方法小結【md5,base64,sha1】

    Python加密方法小結【md5,base64,sha1】

    這篇文章主要介紹了Python加密方法,結合實例形式總結分析了md5,base64,sha1的簡單加密方法,需要的朋友可以參考下
    2017-07-07
  • Python2和Python3中print的用法示例總結

    Python2和Python3中print的用法示例總結

    在Python 3中接觸的第一個很大的差異就是縮進是作為語法的一部分,這和C++等其他語言確實很不一樣,所以要小心,其中python3和python2中print的用法有很多不同,這篇文章主要給大家介紹了關于Python2和Python3中print用法的相關資料,需要的朋友可以參考下。
    2017-10-10
  • python實現(xiàn)在控制臺輸入密碼不顯示的方法

    python實現(xiàn)在控制臺輸入密碼不顯示的方法

    這篇文章主要介紹了python實現(xiàn)在控制臺輸入密碼不顯示的方法,實例分析了Python基于console模塊實現(xiàn)密碼顯示星號輸入的技巧,需要的朋友可以參考下
    2015-07-07
  • python中的urlparse()方法使用

    python中的urlparse()方法使用

    這篇文章主要介紹了python中的urlparse()方法使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 用Python寫一段用戶登錄的程序代碼

    用Python寫一段用戶登錄的程序代碼

    下面小編就為大家分享一篇用Python寫一段用戶登錄的程序代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • django 快速啟動數(shù)據(jù)庫客戶端程序的方法示例

    django 快速啟動數(shù)據(jù)庫客戶端程序的方法示例

    這篇文章主要介紹了django 快速啟動數(shù)據(jù)庫客戶端程序的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Kotlin 中的 apply 函數(shù)用法詳解

    Kotlin 中的 apply 函數(shù)用法詳解

    apply 函數(shù)是 Kotlin 中一個十分方便的工具,它使得對對象進行初始化和配置變得更加簡潔、清晰,通過與 Java 的對比,我們可以看出 Kotlin 在處理類似情況時具有更高的表現(xiàn)力和簡潔性,本文給大家介紹Kotlin apply 函數(shù)的用法,感興趣的朋友一起看看吧
    2024-03-03
  • python如何通過twisted實現(xiàn)數(shù)據(jù)庫異步插入

    python如何通過twisted實現(xiàn)數(shù)據(jù)庫異步插入

    這篇文章主要為大家詳細介紹了python如何通過twisted實現(xiàn)數(shù)據(jù)庫異步插入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

故城县| 伊吾县| 班玛县| 民乐县| 临洮县| 汽车| 叶城县| 辽阳县| 买车| 乌恰县| 乐至县| 新宁县| 永城市| 冀州市| 南宫市| 临颍县| 巴楚县| 天柱县| 清新县| 黔东| 平阴县| 东山县| 班玛县| 杭锦后旗| 工布江达县| 新化县| 沽源县| 嘉定区| 梅州市| 易门县| 唐山市| 阿鲁科尔沁旗| 施甸县| 岑溪市| 德昌县| 彰武县| 闸北区| 沽源县| 通渭县| 衡山县| 溆浦县|