你能不能帮我优化我的第一个python程序,我正在尝试定义一个随机生成器,但不知何故,当我把一个大数字挂起时......
def rand(seed, x):
if x == 1:
return seed
elif x == 2:
return 1237
elif x == 3:
return 345892
else:
return ((31 * rand(seed, (x - 3))) + (103 * rand(seed, (x - 2))) + (7 * rand(seed, (x - 1))) + 500003) % 1000001
请尝试:
print(rand(5, 5)), the result is : 506860
但是当你使用更大的数字时,问题就是:
print(rand(50, 50))
答案 0 :(得分:3)
您可以使用dynamic programming:
def rand(seed, x):
table = [seed, 1237, 345892]
for _ in range(x - 3):
next_num = table[-3] * 31 + table[-2] * 103 + table[-1] * 7
next_num += 500003
next_num %= 1000001
table.append(next_num)
return table[-1]
这个更快的原因是它只计算每个值一次,而你的代码以指数方式计算事物。
此算法为O(n)
(对于长度为x - 3
的循环),而您的算法为O(1.83...^n)
(1.83^3=1+1.83+1.83^2
)。
或者,正如评论中所建议的那样,您可以使用functools.lru_cache
:
import functools
@functools.lru_cache()
def rand(seed, x):
# insert your code here
这与前面的代码几乎完全相同,但使用装饰器来记忆结果,而不是将它们存储在列表中。