@lru_cache
ডিফল্ট ফাংশন মানগুলির সাথে নিখুঁত নয়
আমার mem
শোভাকর:
import inspect
def get_default_args(f):
signature = inspect.signature(f)
return {
k: v.default
for k, v in signature.parameters.items()
if v.default is not inspect.Parameter.empty
}
def full_kwargs(f, kwargs):
res = dict(get_default_args(f))
res.update(kwargs)
return res
def mem(func):
cache = dict()
def wrapper(*args, **kwargs):
kwargs = full_kwargs(func, kwargs)
key = list(args)
key.extend(kwargs.values())
key = hash(tuple(key))
if key in cache:
return cache[key]
else:
res = func(*args, **kwargs)
cache[key] = res
return res
return wrapper
এবং পরীক্ষার জন্য কোড:
from time import sleep
@mem
def count(a, *x, z=10):
sleep(2)
x = list(x)
x.append(z)
x.append(a)
return sum(x)
def main():
print(count(1,2,3,4,5))
print(count(1,2,3,4,5))
print(count(1,2,3,4,5, z=6))
print(count(1,2,3,4,5, z=6))
print(count(1))
print(count(1, z=10))
if __name__ == '__main__':
main()
ফলাফল - ঘুমের সাথে মাত্র 3 বার
তবে @lru_cache
এটি 4 বার হবে কারণ এটি:
print(count(1))
print(count(1, z=10))
দুবার গণনা করা হবে (ডিফল্টগুলির সাথে খারাপ কাজ করা)