任何人都可以解释什么是备忘录吗?

时间:2016-02-02 06:20:34

标签: python memoization python-decorators

以下统计数据是Fibonacci函数调用统计数据

以下是运行探查器后获得的一些统计信息

[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)

使用 memoization 后,探查器统计信息

  [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)

总函数调用减少了很多。如果可能,请提供一些链接以获取有关存储的更多详细信息。

2 个答案:

答案 0 :(得分:2)

来自 Wikipedia ::在计算中,memoization是一种优化技术,主要用于通过存储昂贵的函数调用的结果来加速计算机程序,并在再次出现相同的输入时返回缓存的结果。 / p>

https://en.wikipedia.org/wiki/Memoization

在你的情况下,大概是(我猜这里但让它骑),你的数组中的每个元素都存储为一个总和。没有记忆,这些总和会一次又一次地计算出来。通过记忆,它会再次下降,而不会再次出现。

答案 1 :(得分:0)

记忆有效地指基于方法输入记住(“memoization” - &gt;“备忘录” - &gt;要记住)方法调用的结果,然后返回记住的结果而不是再次计算结果。您可以将其视为方法结果的缓存。有关更多详细信息,请参阅Cormen等人的第365页,Introduction to Algorithms(3e)