用python實現乙個簡單的cache系統

2021-06-25 09:30:27 字數 2513 閱讀 1508

2023年01月02日

⁄ 綜合 ⁄ 共 2016字 ⁄ 字型大小

小 中 大

原文檢視:

本文章的**

本篇文章將介紹python中的decorator,中文翻譯為 裝飾器 魔法。在這篇文章中我們將熟悉decorator使用的基本方式和基本使用例子,並利用decorator來實現乙個高階的例子—快取系統(cache system)。

decorator已某種方式可以簡化編碼量,並增加了**的可讀性,這也是為何python中引入了 裝飾器 魔法。我們可以看看如下例子:

def

foo(

self

):pass

foo

=classmethod

(foo

)

可以看出以上的**結構讓人看起來不舒服,如果使用了裝飾器,那麼一切將變得美好。

@classmethod

deffoo

(self

):pass

在python中,裝飾器(decorator)是用於修改函式,類方法的python物件。裝飾器可以分為函式,類裝飾器,對裝飾器唯一的限制是 其可呼叫性(callable),我們知道,函式本身是可呼叫的,所以如果使用類裝飾器,我們就必須實現類的__call__方法。

裝飾器必須用在合適的地方,否則並不能得到很好的效果,比如我們要用裝飾器實現以下的功能:

def

value

():return

"hello world!"

使其輸出結果為

那麼我們可以建立如下的裝飾器:

defli(

func

):return""+

func()+

""defh1(

func

):return

""

然後這樣呼叫即可

@h1

@lidef

value

():return

"hello world!"

print

value

()

即增加了**的可讀性,又提高**的可重用性。

看過一些簡單的使用方法後,我們可以用數學語言來描述裝飾器。

@f1

(arg

)@f2

deffunc

():pass

等價於

def

func

():pass

func =f1

(arg

)(f2

(func

))

當初我也在接觸到裝飾器一些簡單的使用方式後,並不對裝飾器很感興趣,因為我們畢竟可以用其他的方式實現其功能,但是後面無意中接觸到了用裝飾器做cache系統,讓我突然覺得有裝飾器的好處和妙處。

假如,我們有乙個如下遞迴,用來實現fibonacci_number遞迴

def

fib(n):

ifn

<2:

return

1return

fib(n-

1)+fib(n-2)

這個遞迴有什麼問題呢,我們知道遞迴在通常情況下,會產生許多相同的子呼叫,因此我們需要乙個快取來儲存中間結果,可以加速遞迴過程。

我們來對比一下使用cache系統之後的前後遞迴呼叫過程,以fib(5)為例:

可以發現重複呼叫子過程的現象消失,我還用profile對比了一下時間,後者快了許多,特別是當fib引數越大的時候,那我們如何實現這個cache系統,下面給出乙個簡單的版本:

from

functools

import

wraps

defcache

(func

):caches ={}

@wraps

(func

)def

wrap

(*args

):if

args

notin

caches

:caches

[args]=

func

(*args

)return

caches

[args

]return

wrap

使用方法非常簡單

@cache

deffib(n

):if

n <2:

return

1return

fib(n-

1)+fib(n

-2)print

fib(5)

#call fib so easy!

從上面我們看出,我們在沒有任何**修改的前提下實現了乙個簡單的cache系統,記住沒有修改任何**的前提下,還有就是並不是所有的遞迴都適合此類方法,比如二叉樹就沒有必要,當且只有重複的子過程呼叫時採用此方法才有實際意義,反之,畫蛇添足。

reference:

用python實現乙個簡單的cache系統

原文檢視 本篇文章將介紹python中的decorator,中文翻譯為 裝飾器 魔法。在這篇文章中我們將熟悉decorator使用的基本方式和基本使用例子,並利用decorator來實現乙個高階的例子 快取系統 cache system decorator已某種方式可以簡化編碼量,並增加了 的可讀性...

用Python實現乙個簡單的加密程式

生活中,有時候我們需要對一些重要的檔案進行加密,python 提供了諸如 hashlib,base64 等便於使用的加密庫。對於日常學習而言,我們可以借助異或操作,實現乙個簡單的檔案加密程式,從而強化自身的程式設計能力。基礎知識 在 python 中異或操作符為 也可以記作 xor。按位異或的意思是...

用python實現乙個簡單的詞云

對於在windows pycharm工具 裡實現乙個簡單的詞云還是經過了幾步小挫折,跟大家分享下,如果遇到類似問題可以參考 1.匯入wordcloud包時候報錯,當然很明顯沒有安裝此包。2.安裝過程中報乙個關於 vc 編譯器的錯誤。3.安裝wordcloud成功後,在pycharm裡面執行from ...