在公共函数或低级私有函数上使用Python的lru_cache / memoize功能是否更好,还是重要?

时间:2018-04-04 19:36:20

标签: python caching

在Python 3中,给定公开&私人职能,如下:

def my_public_function(a, b, c) -> int:
    rv = _my_private_function(a, b, c)
    return rv

def _my_private_function(a, b, c) -> int:
    return a + b + c

如果我想使用functools.lru_cache对此进行优化,我最好在公共功能或私有功能上执行此操作吗?

我的直觉是公共功能,因此它会尽早缓存并返回而不会触及任何其他内容。

from functools import lru_cache

@lru_cache()
def my_public_function...

是否有任何设计模式或其他设计原则建议在@lru_cache()上使用_my_private_function

2 个答案:

答案 0 :(得分:1)

通过在公共函数中处理这个来节省时间(函数调用和2个添加)。在python中,并不存在" private"功能。约会以_开头,告诉别人远离,但没有特定的语言。所以它对任何调用函数都没有影响,包括lru_cache。

答案 1 :(得分:1)

对此没有通用的答案,因为基本上没有选择放置缓存的位置无效的情况。如果这样的情况,请将其放在公共函数上以跳过额外的函数调用以及公共函数必须执行的任何其他设置工作。但那只是永远不会出现。相反,它会像:

  • 帮助函数是微不足道的,如您的示例所示,额外函数调用的成本与您尝试优化的其他函数的成本相同。然后你几乎肯定想把助手插入公共功能,然后只有一个地方可以记忆。
  • 辅助函数很简单,但它被一堆不同的公共函数调用。为每个公共功能提供自己的缓存,复制所有其他缓存所做的工作,将浪费更多的资源,并导致更多的缓存未命中,而不是优化包装器的东西将节省。
  • 帮助程序非常重要,导致LRU与辅助缓存和顶级缓存之间存在实际的语义差异。因此,您必须根据哪一个是正确的而不是基于性能问题来决定。
  • 帮助程序是非常重要的,当你缓存事物时它在语义上并不重要 - 但你经常使用相同的值调用帮助程序,即使对于公共函数的不同输入也是如此。因此,通过记忆帮助程序获得的收益将大大淹没在额外函数调用之前而不是之后的memoizing的微优化。

等等。