2012-09-20 3 views
2

나는이 memoize 데코레이터를 클래스에 사용하고 있으며 매우 효과적입니다. 이제는 메모리 소비를 제어하기 위해 속도 중 일부를 교환 할 준비가되었습니다. 이상적으로는 최대 값을 설정할 수 있습니다. (예 : 2GB) 그러나 나는 시행 착오를 많이하고 캐시에있는 객체의 최대 개수를 결정할 수 있다고 생각합니다.memoize 할 최대 캐시 크기를 적용하는 방법은 무엇입니까?

누구든지이 작업을 수행 할 준비가 된 코드를 알고 있습니까? 나는 가장 새로운 것을 추가하기 위해 캐시에서 가장 오래된 것을 버릴 것이라고 생각한다.

아니면 더 합리적인 방법이 있습니까? 그것은 나를라면

@memoize(max=2000) 
class Foo(object): 
    ... 
+0

개체의 크기가 다른 경우 캐시에서 사용하는 메모리 공간을 예측하기가 어려울 수 있습니다. 마지막으로 사용한 객체가 재사용 될 것으로 기대할 수 없다면 최상의 전략은 메모리에 첫 번째 xxx 객체를 유지하는 것일 수 있습니다. –

답변

6

, 표준 라이브러리에서 좋은 캐싱 장식 이미있다 :

import functools 

@functools.lru_cache(maxsize=1000) 
def fun(...): 

을 그렇지 않으면, 난 그냥 lru_cache의 구현을 살펴이있을 것이다. 이것은 더 나은 캐시 성능을위한 LRU 의미론 (예 : 사용중인 FIFO 의미론과 같이 조금 더 정교함)이있는 순수한 Python 범용 메모 매거진입니다.

+1

2.6+ 버전이 http://code.activestate.com/recipes/578078/에서 발견되었습니다. –

1

아마 할 것 :

def memoize(obj): 
    """A decorator to cache advice objects using the advice key""" 
    cache = obj.cache = {} 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     key = args[0] 
     if key not in cache: 
      cache[key] = obj(*args, **kwargs) 
     return cache[key] 

    return memoizer 

이 같은 장식에 인수으로 최대를 제공 분별 같다 : 여기

내가 현재 사용하고 루틴의

from collections import deque 

def memoize(obj, maxlen = None): 
    """A decorator to cache advice objects using the advice key""" 
    cache = obj.cache = {} 
    deck = obj.deck = deque([], maxlen = maxlen) 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     key = args[0] 
     if key not in cache: 
      if len(deck) == deck.maxlen: 
       del cache[deck.popleft()[0]] 
      temp = obj(*args, **kwargs) 
      cache[key] = temp 
      deck.append((key, temp)) 
     return cache[key] 

    return memoizer 

나는 닫아야한다. 그러나 편집자가 프롬프트에 표시하지는 않았다. 약간의 정제가 필요할 수 있습니다. 파이썬 3.2을 사용하는 경우

관련 문제