python--基礎知識点--@lru_cache()


非常に単純なコードです
一般呼び出し方式
def console1(a, b):
    print("    ")
    return (a, b)

print(console1(3, 'a'))
print(console1(2, 'b'))
print(console1(3.0, 'a'))


"""
    :
    
(3, 'a')
    
(2, 'b')
    
(3.0, 'a')
"""

アクセサリーを使用した後
次にfunctoolsモジュールのlru_を導入しますCache,python 3にはモジュールが付属しています.
from functools import lru_cache


@lru_cache()
def console2(a, b):
    print("    ")
    return (a, b)


print(console2(3, 'a'))
print(console2(2, 'b'))
print(console2(3.0, 'a'))


"""
    :
    
(3, 'a')
    
(2, 'b')
(3, 'a')
"""

関数の印刷が1回少なくなったことに気づきました.これはどういうことですか.これが次に言うLRUキャッシュ技術です.
LRUとは何かを理解しますLRU (Least Recently Used)は、キャッシュ置換ポリシーの一般的なアルゴリズムである.キャッシュ・キューがいっぱいになった場合、新しい要素がキューに追加されると、既存のキューから要素を削除する必要があります.LRUポリシーは、最近最もアクセスされた要素を削除し、新しい要素にスペースを空けることです.
pythonでの実装
python 3のfunctoolsモジュールのlru_cacheがこの機能を実現しましたlru_Cache装飾器は従来の関数運転の結果を記録し,メモ機能を実現し,パラメータ繰返し時の繰り返し呼び出しを回避し,性能向上の役割を果たし,再帰関数において特に顕著な役割を果たす.これは最適化技術であり、同じパラメータが入力されたときに計算を繰り返すことを避けるために、時間のかかる関数の結果を保存します.
パラメータ付きlru_cache
使用方法lru_Cache(maxsize=128、typed=False)maxsizeは、この関数の呼び出し結果を最大1つキャッシュすることができ、プログラムの実行効率を向上させ、特に時間のかかる関数に適しています.パラメータmaxsizeは最大キャッシュ回数で、Noneの場合は無制限で、2のn乗に設定するとパフォーマンスが最適です.typed=Trueの場合、f(3)とf(3.0)のような異なるパラメータタイプの呼び出しがキャッシュされ、デフォルトのFalseには統合コードがあります.
from functools import lru_cache

def console1(a, b):
    print("    ")
    return (a, b)


@lru_cache()
def console2(a, b):
    print("    ")
    return (a, b)


@lru_cache(maxsize=256, typed=True)
def console3(a, b):
    '''

    :param a:
    :param b:
    :return:
    '''
    print("    ")
    return (a, b)


print(console1(3, 'a'))
print(console1(2, 'b'))
print(console1(3.0, 'a'))
print("*" * 40)
print(console2(3, 'a'))
print(console2(2, 'b'))
print(console2(3.0, 'a'))
print("*" * 40)
print(console3(3, 'a'))
print(console3(2, 'b'))
print(console3(3.0, 'a'))

同様に爬虫類の再操作に用いられ,ウェブページの重複要求を避けることができる.後期に保存するときに判断すればよい.
from functools import lru_cache
from  requests_html import HTMLSession


session=HTMLSession()


@lru_cache()
def get_html(url):
    req=session.get(url)
    print(url)
    return req


urllist=["https://www.baidu.com","https://pypi.org/project/pylru/1.0.9/","https://www.baidu.com"]

if __name__ == '__main__':
    for i in urllist:
        print(get_html(i))


"""
    :
https://www.baidu.com

https://pypi.org/project/pylru/1.0.9/


"""