3

コードで 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)
4

5 に答える 5

6

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):
于 2016-04-18T02:15:40.687 に答える
2

ドキュメントによると、もう1つの側面は次のとおりです。

maxsize が None に設定されている場合、LRU 機能は無効になり、キャッシュは際限なく大きくなる可能性があります。LRU 機能は、maxsize が 2 の累乗の場合に最適に機能します。

ドキュメントの例

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)
于 2019-10-20T13:47:01.187 に答える