假设我有一个引用透明的功能。很容易记住它;例如:
def memoize(obj):
memo = {}
@functools.wraps(obj)
def memoizer(*args, **kwargs):
combined_args = args + (kwd_mark,) + tuple(sorted(kwargs.items()))
if combined_args not in memo:
memo[combined_args] = obj(*args, **kwargs)
return cache[combined_args]
return memoizer
@memoize
def my_function(data, alpha, beta):
# ...
现在假设data
论点my_function
很大;说,这是一个frozenset
有数百万个元素的。在这种情况下,记忆的成本是令人望而却步的:每次,我们都必须将计算hash(data)
作为字典查找的一部分。
我可以使memo
字典成为一个属性,而不是装饰器data
内的一个对象。memoize
这样我可以data
在进行缓存查找时完全跳过参数,因为另一个巨大frozenset
的相同的机会可以忽略不计。但是,这种方法最终会污染传递给my_function
. 更糟糕的是,如果我有两个或更多的大论点,这根本无济于事(我只能附加memo
一个论点)。
还有什么可以做的吗?