假设我使用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(...
之间切换,但在更复杂的情况下,这可能是不可能的。
问题:是否可以检查缓存了哪些号码并根据该号码订购了这些号码?会有什么开销呢?
答案 0 :(得分:1)
不,不,cache
中使用的lru
专门设计为不面向公众。它的所有内部are encapsulated用于线程安全,并且如果实现发生更改,则不会破坏代码。
除此之外,我不认为基于缓存建立输入是个好主意,您应该根据您的输入进行缓存。如果不使用相同的参数定期调用callable,则缓存可能不是最佳选择。