代码之家  ›  专栏  ›  技术社区  ›  jonnybolton16

当参数的顺序无关紧要时,我如何部署缓存?

  •  0
  • jonnybolton16  · 技术社区  · 7 月前

    说我有一个功能 func ,恰好拥有以下属性 func(a, b) == func(b, a) 总是 True .

    然后说我用 @cache 装饰师来自 functools 我对那个装修师的理解是,这是第一次 func(a, b) 它的结果被缓存,这样每当 函数(a,b) 如果再次调用,它可以只查找结果,而不是再次调用函数。

    现在,如果我理解正确,如果我跑 func(b, a) 函数将被调用,作为特定的输入元组 (b, a) 尚未缓存。然而,鉴于我们知道 函数(b,a) 结果与 函数(a,b) ,在这种情况下,有没有办法利用缓存?

    简而言之,在缓存时,有没有一种方法可以忽略参数的顺序?

    1 回复  |  直到 7 月前
        1
  •  1
  •   JonSG    7 月前

    如果你想缓存结果,而参数的顺序无关紧要,我很想对参数进行排序。

    import functools
    
    def sort_parameters(func):
        return lambda *args, **kwargs: func(*sorted(args), **kwargs)
    
    @sort_parameters
    @functools.cache
    def mult(a, b):
        print("method actually called")
        return a * b
    
    print(mult(2, 3))
    print(mult(2, 3))
    print(mult(3, 2))
    

    应该给你:

    method actually called
    6
    6
    6