これが私のコードです。
import timeit
fac_mem = {}
def fac(k):
if k < 2: return 1
if k not in fac_mem:
fac_mem[k] = k*fac(k-1)
return fac_mem[k]
def fact(k):
if k < 2: return 1
return k*fact(k-1)
if __name__ == "__main__":
print timeit.timeit("fac(7)","from __main__ import fac")
print timeit.timeit("fact(7)","from __main__ import fact")
print timeit.timeit("fac(70)","from __main__ import fac")
print timeit.timeit("fact(70)","from __main__ import fact")
ここに出力があります
0.236774399224
0.897065011572
0.217623144304
14.1952226578
さて、プログラムが実行される前は、dict は空ですが、メモ化によって階乗が高速化されるのはなぜでしょうか? つまり、この 2 つのバージョンの呼び出し回数は同じです。次に、コードを少し変更し、辞書を関数に移動しました。
def fac(k):
fac_mem = {}
if k < 2: return 1
if k not in fac_mem:
fac_mem[k] = k*fac(k-1)
return fac_mem[k]
出力が変わった
1.92900857225
0.910026658388
25.5475004875
14.2164999769
なぜ遅いのですか?関数内で生成された値が一時的にスタックに格納されるためでしょうか。外側の変数はグローバルですが、何がそんなに高速なのですか? 誰かが私のためにそれを片付けてくれるほど親切にしてくれませんか? ありがたく思います。