元fib
関数は、が一緒memo
クロージャと、f
クロージャとして入手可能な本来の機能オブジェクトと、helper()
機能によって置き換えられる:これは置換をhelper
関数を与える
>>> def fib(n):
... if n in (0,1):
... return n
... return fib(n - 1) + fib(n - 2)
...
>>> fib
<function fib at 0x1023398c0>
>>> memoize(fib)
<function helper at 0x102339758>
クロージャーを呼び出すたびに、helper()
関数と同じようにmemo
ディクショナリーを使用して、現在の値x
の結果をルックアップします。
あなたはこのインタプリタですべての作業を参照することができますが
>>> @memoize
... def fib(n):
... if n in (0,1):
... return n
... return fib(n - 1) + fib(n - 2)
...
>>> fib
<function helper at 0x10232ae60>
注関数名!それはhelper
です。これは、閉鎖を持っています
>>> fib.__closure__
(<cell at 0x10232d9f0: function object at 0x10232ade8>, <cell at 0x10232da98: dict object at 0x102353050>)
関数オブジェクトと辞書、それらはそれぞれf
とmemo
、です。 .cell_contents
でセルの内容にアクセスします。
>>> fib.__closure__[0].cell_contents
<function fib at 0x10232ade8>
>>> fib.__closure__[1].cell_contents
{}
オリジナルの装飾が施され機能と空の辞書大丈夫だこと。のは、この機能を使ってみましょう:0
と1
からx
セットについて得られた値をだ
は >>> fib(0)
0
>>> fib(1)
1
>>> fib.__closure__[1].cell_contents
{0: 0, 1: 1}
memo
辞書に格納されています。次にfib
にどちらかの値を指定すると、そのメモが使用されます。新x
値が計算され、追加されます。
>>> fib(2)
1
>>> fib.__closure__[1].cell_contents
{0: 0, 1: 1, 2: 1}
あなたはより多くの計算にかかる時間タイミングで動作するどのようにうまく見ることができます。
>>> start = time.clock(); fib(500); print(format(time.clock() - start, '.10f'))
139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125L
0.0008390000
>>> start = time.clock(); fib(500); print(format(time.clock() - start, '.10f'))
139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125L
0.0000220000
>>> start = time.clock(); fib(500); print(format(time.clock() - start, '.10f'))
139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125L
0.0000190000
最初の呼び出しの後、メモを見ています
>>> len(fib.__closure__[1].cell_contents)
501
_ "fib(n)のnの呼び出された値がヘルパー(x)のxにどのように効果的に変換されるか" _私はあなたがそれを後方に持っていると思います。例えば 'fib(5)'のように誰かが呼び出すと、実際に呼び出されるのは 'helper(5)'なので 'x'は' 5'です。 'helper'は' memo [5] = f(5) 'という(実際の)' fib 'を呼び出し、 'n'も' 5'です。これらは通常の関数呼び出しです。マジックは全く関係しません。 –
私は非常に良い回答を見てきました(http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python/1594484#1594484 )、それは私の特別な困難に対処していないようです。 – MichaelMaggs
@MichaelMaggs:あなたはデコレータがどのように機能しているか誤解しています。 –