2016-08-05 29 views
0

說我有這個方法,我的緩存使用lru_cachePython的lru_cache使用優化

@lru_cache(maxsize=8) 
def very_expensive_call(number): 
    # do something that's very expensive 
    return number 

我調用此方法是這樣的:

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

由於緩存的MAXSIZE爲8,只此時,數字2-9被緩存。

call_1後,我做的call_2:

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

在call_2,再次第一個數字0被稱爲(不在緩存!),而數字後0和3-9被緩存。 然後調用號碼1(不在高速緩衝存儲器!),然後數字0-1和4-9被高速緩存。 哦,你看這是怎麼回事:高速緩存是從未使用過...

我明白,這個具體的例子我可以range(...reverse(range(...之間,但在更復雜的場景,也許不可能的交替。

問題:是否有可能檢查哪些數字被緩存並根據該數字進行調用?這會產生什麼樣的開銷?

回答

1

不,不,lru中使用的cache專門設計爲不面向公衆。它的所有內部函數are encapsulated用於線程安全,並且爲了在實現更改時不破壞代碼。

除此之外,我不認爲基於緩存的輸入是一個好主意,您應該根據您的輸入進行緩存。如果您的調用未被定期調用相同的參數,緩存可能不是最佳選擇。

+0

感謝您的回答。我知道它違背了lru_cache哲學。我認爲這對我來說更像是一個優化問題:遇到這個問題時,當我發現我只是反覆地調用了一個方法而只是多了一些不同的參數,我的maxsize和突然緩存就不再使用了。可能會隨着最大化的增加而回落。 –