【问题标题】:Can anyone Explain what is memoization?任何人都可以解释什么是记忆?
【发布时间】:2016-05-10 20:12:04
【问题描述】:

以下统计为斐波那契函数调用统计

这是我在运行分析器后得到的一些统计数据

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

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

【问题讨论】:

    标签: python memoization python-decorators


    【解决方案1】:

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

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

    在您的情况下,大概(我在这里猜测,但让它顺其自然),您的数组中的每个元素都被存储为一个总和。如果没有记忆,这些总和会一次又一次地计算。有了记忆,它就会一次又一次地下降。

    【讨论】:

      【解决方案2】:

      记忆化实际上是指根据方法输入记住(“记忆化”->“备忘录”->要记住)方法调用的结果,然后返回记住的结果,而不是再次计算结果。您可以将其视为方法结果的缓存。有关详细信息,请参阅 Cormen 等人的第 365 页,算法简介 (3e)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2020-09-21
        • 1970-01-01
        相关资源
        最近更新 更多