pythonで簡単なcacheシステムを実現


詳細
原文:
http://www.ibaiyang.org/2013/01/04/python-decorator-introduction/
この文章ではpythonのdecoratorを紹介し、中国語で装飾器魔法に翻訳します.この文章では、decoratorが使用する基本的な方法と基本的な使用例を熟知し、decoratorを利用して高度な例であるキャッシュシステム(cache system)を実現します.
Decoratorは何らかの方法で符号化量を簡略化し、コードの可読性を高めることができ、pythonに装飾器魔法が導入された理由でもある.次の例を見てみましょう.
def foo(self):
    pass
foo = classmethod(foo)

以上のコード構造は不快に見えますが、アクセサリーを使うとすべてが美しくなります.
@classmethod
def foo(self):
    pass

pythonでは、デコレータ(decorator)は関数、クラスメソッドを変更するためのpythonオブジェクトです.装飾器は関数、クラス装飾器に分けることができ、装飾器に対する唯一の制限はその呼び出し性(callable)であり、関数自体が呼び出し可能であることを知っているので、クラス装飾器を使用すると、クラスの__を実現しなければならない.call__方法.
装飾器は適切な場所で使用しなければなりません.そうしないと、次の機能を実現するために装飾器を使用します.
def value():
    return "hello world!"

結果を
	

  • hello world!
  • 那么我们可以建立如下的装饰器:

    def li(func):
        return "
  • "
  • + func() + "" def h1(func): return "

    "

    + func() + ""

    そして呼び出せばいい
    @h1
    @li
    def value():
        return "hello world!"
    
    print value()

    すなわち、コードの可読性が向上し、コードの再利用性が向上する.
    いくつかの簡単な使い方を見た後、私たちは数学の言語で装飾器を説明することができます.
    @f1(arg)
    @f2
    def func(): pass

    に等しい
    def func(): pass
    func = f1(arg)(f2(func))

    当初、私も装飾器の簡単な使い方に触れた後、装飾器に興味を持っていませんでした.私たちは結局他の方法でその機能を実現することができますが、後で何気なく装飾器でcacheシステムを作ることに触れて、突然装飾器のメリットとすばらしさを感じました.
    もし、次のような再帰があれば、Fibonacciを実現するために使用されます.number再帰
    def fib(n):
        if n < 2:
            return 1
        return fib(n-1) + fib(n-2)

    この再帰にはどのような問題がありますか.再帰は通常、同じサブコールが多く発生することを知っています.そのため、中間結果を保存するためにキャッシュが必要です.再帰プロセスを加速することができます.
    cacheシステムを使用した後の前後再帰呼び出しプロセスを比較し、fib(5)を例に挙げます.
    用python实现一个简单的cache系统_第1张图片
     
     
     
     
     
     
     
     
     
     
     
     
    サブプロシージャを繰り返し呼び出す現象が消えることがわかります.profileで時間を比較しました.後者はずっと速くなりました.特にfibパラメータが大きいほど、このcacheシステムをどのように実現するか、簡単なバージョンを示します.
    from functools import wraps
    
    def cache(func):
        caches = {}
        @wraps(func)
        def wrap(*args):
            if args not in caches:
                caches[args] = func(*args)
            return caches[args]
        return wrap

    使い方はとても簡単です
    @cache
    def fib(n):
        if n < 2:
            return 1
        return fib(n-1) + fib(n-2)
    
    print fib(5) #call fib so easy!

    以上から,コード修正がない前提で簡単なcacheシステムを実現し,コードを修正していないことを覚えておく前提と,二叉木のようなすべての再帰がこのような方法に適しているわけではないことを示した.
    Reference:
    http://code.activestate.com/recipes/577479-simple-caching-decorator/
    http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/
    -----------------------質の高い文章を作るには、酒を恨みを晴らすことにもっと注目しなければならない.
    高品質な文章を作るために、お勧めしてください...ありがとうございます.私の後続の文章に注目してください.もっとすばらしいですよ.
    sina微博に注目してください.http://weibo.com/baiyang26
    酒を恨みを晴らす公式ブログ:http://www.ibaiyang.org【google readerでの購読を推奨】
    酒を恨みを晴らす公式豆弁:http://www.douban.com/people/baiyang26/
    このブログを転載したい場合は、出典を明記してください
    本文にご意見やご提案がございましたら、メッセージをお待ちしております