假设我有一个使用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。然后调用number 1 (不在缓存中!)之后,数字0-1和4-9被缓存。好吧,你知道这是怎么回事:缓存从来没有用过.
我理解,对于这个特定的例子,我可以在range(...和reverse(range(...之间交替使用,但是在一个更复杂的场景中,这可能是不可能的。
问题:是否可以检查缓存的数字并根据这些数字对调用进行排序?这样做的开销是多少?
发布于 2016-08-05 18:00:45
不,不,在lru中使用的lru是专为不面向公众而设计的。它的所有内部部件-- https://hg.python.org/cpython/file/3.5/Lib/functools.py#l411 --用于线程安全,并且如果实现发生变化,则为了不中断代码。
除此之外,我不认为将您的输入建立在缓存基础上是个好主意,您应该根据您的输入进行缓存。如果没有用相同的参数定期调用可调用的,那么缓存可能不是最好的选择。
https://stackoverflow.com/questions/38793633
复制相似问题