2016-08-05 4 views
0

말은 내가 lru_cache를 사용하여 캐시 할이 방법이 숫자 2-9가이 시점에서 캐시됩니다.파이썬 lru_cache 사용 최적화

print([very_expensive_call(i) for i in range(10)]) # call_2 

이 call_2 동안, 다시 첫 번째 숫자 0은 (하지 캐시에!)라고하며, 그 숫자 뒤에 0과 3-9는 캐시 : call_1 후

, 나는 call_2를하고있는 중이 야. 그 다음 숫자 1이 호출되고 (캐시에 없습니다!) 그 다음에 숫자 0-1과 4-9가 캐시됩니다. 이 어디로 글쎄, 당신이 볼 : 캐시가 사용되지 않습니다 ...

나는이 특정 예를 들어 내가 range(...reverse(range(... 사이 그러나 아마 불가능 더 복잡한 시나리오에서 대체 할 수 있음을 이해합니다.

질문 질문 : 캐시 된 번호를 검사하고이를 기반으로 호출을 주문할 수 있습니까? 이것에 대한 오버 헤드는 무엇입니까?

답변

1

아니요, 아니요, cachelru에서 공개적으로 사용하지 않도록 특별히 설계되었습니다. 모든 내부 스레드 are encapsulated은 스레드 안전을 위해 구현이 변경되면 코드를 중단하지 않습니다.

그 외에도 캐싱을 기반으로 입력을 기반으로하는 것이 좋지 않다고 생각합니다. 입력을 기반으로 캐시해야합니다. 호출 가능 항목이 주기적으로 동일한 인수로 호출되지 않으면 캐시가 최선의 선택이 아닐 수도 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 그것이 lru_cache 철학에 위배된다고 생각한다. 제 생각에는 최적화 문제에 더 가깝습니다.이 문제에 관해서는 좀 더 다른 인수를 사용하여 반복적으로 메서드를 호출하면 maxsize가 발생하고 갑자기 캐시가 전혀 사용되지 않는다는 것을 알게되었습니다. 아마도 maxsize가 증가 할 것입니다. –