2016-08-05 24 views
0

は私がlru_cacheを使用してキャッシュこのメソッドを持っていると言う:Pythonのlru_cache使用量の最適化

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

私はこのように、このメソッドを呼び出しています:キャッシュのMAXSIZEが8であるためにのみ、

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

この時点で番号2〜9がキャッシュされます。

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

いいえ、いいえ、cacheは、lruで公開されていないように特別に設計されています。すべての内部構造are encapsulatedスレッドの安全性と、実装が変更された場合にはコードを中断しないためです。

それ以外は、キャッシングに基づいて入力をベースにすることはお勧めできません。入力に基づいてキャッシュする必要があります。呼び出し元が同じ引数で定期的に呼び出されない場合は、キャッシュが最適なオプションではない可能性があります。

+0

お返事ありがとうございます。私はそれがlru_cacheの哲学に反していることを知っている。私はそれが私の場合の最適化の問題だと思う:私は私がmaxsizeと突然キャッシュはもはや使用されていないもう少し異なる引数で繰り返しメソッドを呼び出していることを発見したときにこの問題に出くわしました。おそらく最大サイズの増加に後退します。 –

関連する問題