【问题标题】:Memoization Usage/Cache Storing记忆使用/缓存存储
【发布时间】:2016-05-19 02:48:08
【问题描述】:

我正在编写一个程序,计算两个变量的 Pascal 标识,硬编码到程序中,因为我是 Python 新手并尝试缓存和记忆。这是我到目前为止所拥有的:

counter = 0

call_cacheK = {}
   def callTest(n, k):
   global counter

   if n in call_cacheK:
       return call_cacheK[n]  
   if k == 0:
       return 1
   elif k == n:
       return 1 
   elif (1 <= k) and (k <= (n-1)):
       counter += 1
       #call_cacheK[n] = result
       result = ((callTest(n-1, k) + callTest(n-1, k-1)))
   print(result)
   return result

callTest(20, 11)
#167,960

我的函数将输出最终的真实答案,但会输出很多答案。我似乎不知道如何正确存储要在缓存中使用的值。

如何正确使用call_cacheK来存储我已经使用过的result值?

谢谢。

【问题讨论】:

  • 记忆化的规范方法是使用装饰器,我建议你研究一下。至于这一点,您似乎没有尝试将任何内容放入缓存中。

标签: python caching memoization


【解决方案1】:

让我们看看。首先,您有两个变量的函数,但仅通过一个参数将结果存储在缓存中。所以callTest(20, 11)、callTest(20, 10)、callTest(20, 9) 将在您的缓存中产生一个结果。让我们稍微重写一下你的函数:

call_cacheK = {}

def callTest(n, k):
    if (n, k) in call_cacheK:
        return call_cacheK[(n, k)]  
    if k == 0:
        return 1
    elif k == n:
        return 1 
    elif (1 <= k) and (k <= (n-1)):
        result = ((callTest(n-1, k) + callTest(n-1, k-1)))
        call_cacheK[(n, k)] = result
    print(result)
    return result

是的,没有计数器变量,因为我不知道你为什么需要它:)

另外,据我判断使用print(result),您可能使用的是Python3.x。如果是这样,您可以使用standard cache implementing:

from functools import lru_cache

@lru_cache(maxsize=None)
def callTest2(n, k):  
    if k == 0:
        return 1
    elif k == n:
        return 1 
    elif (1 <= k) and (k <= (n-1)):
        result = ((callTest2(n-1, k) + callTest2(n-1, k-1)))
    print(result)
    return result

祝你好运! :)

【讨论】:

  • 谢谢。在您指出单变量问题后,我的错误就很清楚了。这是解决问题的好方法。
  • @user3194722 不客气 :) 如果对您有帮助,您也可以将答案标记为正确。
猜你喜欢
  • 2021-11-24
  • 2016-06-27
  • 2012-07-06
  • 2021-02-21
  • 1970-01-01
  • 2019-05-24
  • 2011-09-22
  • 2014-04-11
  • 2011-11-07
相关资源
最近更新 更多