【问题标题】:Python lru_cache usage optimizationPython lru_cache 使用优化
【发布时间】:2016-12-12 03:05:36
【问题描述】:

假设我有这个方法,我使用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

由于缓存的最大大小为 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(... 之间切换,但在更复杂的情况下这可能是不可能的。

问题:是否可以检查缓存了哪些号码并据此对呼叫进行排序?这样做的开销是多少?

【问题讨论】:

    标签: python python-3.x caching optimization


    【解决方案1】:

    不,不,lru 中使用的 cache 专门设计为不面向公众。它的所有内部结构 are encapsulated 用于线程安全,并且在实现更改时不会破坏代码。

    除此之外,我认为将输入基于缓存并不是一个好主意,您应该根据输入进行缓存。如果您的可调用对象没有定期使用相同的参数调用,那么缓存可能不是最佳选择。

    【讨论】:

    • 感谢您的回答。我知道这违反了 lru_cache 哲学。我认为这更像是一个优化问题:当我发现我用更多不同的参数重复调用一个方法时遇到了这个问题,然后我的 maxsize 和突然缓存根本不再使用了。可能会依靠增加 maxsize。
    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多