Python 有人能解释什么是记忆吗?

Python 有人能解释什么是记忆吗?,python,memoization,python-decorators,Python,Memoization,Python Decorators,以下统计信息是斐波那契函数调用统计信息 以下是我在运行profiler后获得的一些统计数据 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765] 57358 function calls (68 primitive calls) in 0.211 seconds Ordered by: standard name ncalls tottime perc

以下统计信息是斐波那契函数调用统计信息

以下是我在运行profiler后获得的一些统计数据

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
     57358 function calls (68 primitive calls) in 0.211 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   21    0.000    0.000    0.000    0.000 :0(append)
    1    0.000    0.000    0.210    0.210 :0(exec)
   20    0.000    0.000    0.000    0.000 :0(extend)
    1    0.000    0.000    0.000    0.000 :0(print)
    1    0.001    0.001    0.001    0.001 :0(setprofile)
    1    0.000    0.000    0.210    0.210 <string>:1(<module>)
 21/1    0.000    0.000    0.210    0.210 Fibo1.py:12(fib_seq)
57291/21    0.210    0.000    0.210    0.010 Fibo1.py:3(fib)
    1    0.000    0.000    0.211    0.211 profile:0(print(fib_seq(20)) )
    0    0.000             0.000          profile:0(profiler)
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765]
0.211秒内完成57358个函数调用(68个基本调用)
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
21 0.000 0.000 0.000 0.000:0(追加)
1 0.000 0.000 0.210 0.210:0(执行)
20 0.000 0.000 0.000 0.000:0(扩展)
1 0.000 0.000 0.000 0.000:0(打印)
1 0.001 0.001 0.001 0.001:0(设定剖面)
1    0.000    0.000    0.210    0.210 :1()
21/1 0.000 0.000 0.210 0.210纤维比:12(纤维顺序)
57291/21 0.210 0.000 0.210 0.010 Fibo1.py:3(fib)
1 0.000 0.000 0.211 0.211配置文件:0(打印(fib_seq(20)))
0.000 0.000配置文件:0(配置文件器)
使用备忘录后,档案器统计数据

  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
     147 function calls (89 primitive calls) in 0.002 seconds

 Ordered by: standard name

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   21    0.000    0.000    0.000    0.000 :0(append)
    1    0.000    0.000    0.001    0.001 :0(exec)
   20    0.000    0.000    0.000    0.000 :0(extend)
    1    0.000    0.000    0.000    0.000 :0(print)
    1    0.001    0.001    0.001    0.001 :0(setprofile)
    1    0.000    0.000    0.001    0.001 <string>:1(<module>)
   21    0.000    0.000    0.000    0.000 Fibo2.py:16(fib)
 21/1    0.000    0.000    0.001    0.001 Fibo2.py:26(fib_seq)
59/21    0.000    0.000    0.000    0.000 Fibo2.py:9(__call__)
    1    0.000    0.000    0.002    0.002 profile:0(print(fib_seq(20)))
    0    0.000             0.000          profile:0(profiler)
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765]
在0.002秒内进行147次函数调用(89次基本调用)
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
21 0.000 0.000 0.000 0.000:0(追加)
1 0.000 0.000 0.001 0.001:0(执行)
20 0.000 0.000 0.000 0.000:0(扩展)
1 0.000 0.000 0.000 0.000:0(打印)
1 0.001 0.001 0.001 0.001:0(设定剖面)
1    0.000    0.000    0.001    0.001 :1()
21 0.000 0.000 0.000 0.000纤维2.py:16(纤维)
21/1 0.000 0.000 0.001 0.001纤维2.py:26(纤维顺序)
59/21 0.000 0.000 0.000 0.000纤维2.py:9(呼叫)
1 0.000 0.000 0.002 0.002配置文件:0(打印(fib_seq(20)))
0.000 0.000配置文件:0(配置文件器)

函数调用总数大大减少。如果可能,请提供一些链接,以了解有关备忘录的更多详细信息。

来自维基百科::在计算中,记忆是一种优化技术,主要用于存储昂贵函数调用的结果,并在再次出现相同输入时返回缓存结果,从而加速计算机程序


在您的情况下,可能(我在这里猜测,但让它过去),数组中的每个元素都存储为一个和。在没有记忆的情况下,这些总和会反复计算。随着记忆化,它会一次又一次地下降。

记忆化有效地指根据方法输入记住方法调用的结果,然后返回记住的结果,而不是再次计算结果。您可以将其视为方法结果的缓存。有关更多详细信息,请参阅Cormen等人的《算法简介》(3e)第365页