【问题标题】:Usage for lru cache in functoolsfunctools 中 lru 缓存的用法
【发布时间】:2016-04-18 02:04:58
【问题描述】:

我想在我的代码中使用 lru_cache,但是,我得到了这个错误:

NameError: name 'lru_cache' is not defined

我的代码中确实有一个 import functools 但这没有帮助

示例代码在这里:

https://docs.python.org/3/library/functools.html

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

【问题讨论】:

    标签: python lru functools


    【解决方案1】:

    如果你真的只是写了import functools,那还不够。您需要使用from functools import lru_cache 导入lru_cache 符号,或者在尝试使用它时需要限定名称,例如@functools.lru_cache

    在这方面,functools 模块没有什么特别之处。 所有 模块都以这种方式工作。当您导入其他模块并使用其他功能时,您可能已经注意到了。

    【讨论】:

      【解决方案2】:

      使用前需要导入lru_cache

      from functools import lru_cache
      
      @lru_cache(maxsize=None)
      def fib(n):
          if n < 2:
              return n
          return fib(n-1) + fib(n-2)
      

      或者在导入functools时用全名引用:

      import functools
      
      @functools.lru_cache(maxsize=None)
      def fib(n):
      

      【讨论】:

      • 我们可以将@functools.lru_cache(maxsize=32) 用于同一个文件中的多个函数吗?
      【解决方案3】:

      问题中不包含导入行,但应该是:

      from functools import lru_cache
      

      或者,函数装饰器可以更改为:

      @functools.lru_cache(maxsize=None)
      

      【讨论】:

      • 我们可以将@functools.lru_cache(maxsize=32) 用于同一文件中的多个函数吗?
      【解决方案4】:

      另外一点,according to documentation 是:

      如果 maxsize 设置为 None,LRU 功能将被禁用并且缓存 可以无限成长。 LRU 特征在 maxsize 为 二次方。

      文档示例

      import functools
      import urllib
      import requests
      
          @functools.lru_cache(maxsize=32)
          def get_pep(num):
              'Retrieve text of a Python Enhancement Proposal'
              resource = 'http://www.python.org/dev/peps/pep-%04d/' % num
              try:
                  with urllib.request.urlopen(resource) as s:
                      return s.read()
              except urllib.error.HTTPError:
                  return 'Not Found'
      
      
          for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:
              pep = get_pep(n)
              print(n, len(pep))
      
          print(get_pep.cache_info())
      

      输出

      8 106439
      290 59766
      308 56972
      320 49551
      8 106439
      218 46795
      320 49551
      279 48553
      289 50882
      320 49551
      9991 9
      CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)
      

      【讨论】:

      • 我们可以在同一个文件中使用@functools.lru_cache(maxsize=32) 来实现多个功能吗?
      【解决方案5】:

      如果您尝试将 LRU 缓存用于异步功能,它将无法正常工作。试试async-cache。它支持 python 中的异步类型函数,您也可以使用用户定义的数据类型以及原始数据类型作为缓存函数中的参数。 functools.lru_cache 不支持此功能

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多