我想提高值的递归计算的性能
n = 100
def T(n,k):
q = 0
if n == 0 and k == 0:
return(1)
q = 1
if k>n or n<0:
return(0)
q = 1
if q != 1:
return(T(n-1,k-1)+n*T(n-1,k))
for i in range(n):
for n in range(i+1):
print(T(i,n))
print("*********")
但是,我只找到了使用仅接受 1 个参数的函数来执行此操作的方法,如下所示:
def mem(f):
memory = {}
def inner_function(x):
if x not in memory:
memory[x] = f(x)
return memory[x]
else:
return memory[x]
return inner_function
@mem
def fibonacci(n):
if n == 1 or n == 0:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
我正在考虑做一个二维数组,但我还不知道(假设这是可能的)用列表列表来这样做的想法会有什么帮助。
functools.lru_cache
为此
from functools import lru_cache
@lru_cache(maxsize=32)
def T(n,k):
q = 0
if n == 0 and k == 0:
return(1)
q = 1
if k>n or n<0:
return(0)
q = 1
if q != 1:
return(T(n-1,k-1)+n*T(n-1,k))
您可以使用此装饰器来记忆函数调用,特别是使用此函数,这将保存到
maxsize
最近的调用。
请注意,在这种特殊情况下,由于您的 print
语句,实际上大部分时间都花在了写入控制台上。如果您删除它(但仍然保留您的
T(i,n)
调用),您的代码将几乎立即完成。mem
装饰器以使用变量
*args
参数,并在 memory
中查找它们。这也适用于 **kwargs
,不过你必须将它们转换为可哈希类型,例如frozenset
的tuples
。当然,为此,所有参数都必须是可散列的。def mem(f):
memory = {}
def inner_function(*args):
if args not in memory:
memory[args] = f(*args)
return memory[args]
return inner_function
使用您的
T
功能进行测试,工作正常。但实际上,您可能仍然想使用
functools.lru_cache
。#suppose you have a 2 input function
memo = {}
def my_function(a, b):
result = None
#you can store multiple results of the recursion into the dict with different keys
memo[a] = result
memo[b] = result
#your function modified will be
n = 100
memo = {}
def T(n,k):
if n in memo:
return n
elif k in memo:
return k
result = 0
q = 0
if n == 0 and k == 0:
return(1)
q = 1
if k>n or n<0:
return(0)
q = 1
if q != 1:
result = (T(n-1,k-1)+n*T(n-1,k))
memo[n] = result
memo[k] = result
return result
for i in range(n):
for n in range(i+1):
print(T(i,n))
print("*********")