[英]Memory limit exceeded in Python
我正在解決一個需要整數列表或大小為 10^18 的字典的問題。 運行代碼時,編譯器會拋出一條錯誤消息,指出“超出內存限制”。
這是我的代碼:
def fun(l, r, p):
#f = [None, 1, 1]
f = {0:0, 1:1, 2:1}
su = 0
for i in range(1, r):
if i%2 == 0:
f[i+2] = 2*f[i+1] - f[i] + 2
#f.append(2*f[i+1] - f[i] + 2)
else:
f[i+2] = 3*f[i]
#f.append(3*f[i])
for k in range(l, r):
su = su + f[k]
su = (su + f[r]) % p
print(su)
t, p = input().split()
p = int(p)
t = int(t)
#t = 3
#p = 100000007
for i in range(t):
l , r = input().split()
l = int(l)
r = int(r)
fun(l, r, p)
它顯示超出內存限制,最大內存使用量為 306612 KiB。
這里有兩個觀察:
您不需要同時存儲所有數字。 您可以使用 deque 和 generator 函數通過僅跟蹤生成的最后三位數字而不是整個序列來生成數字。
import itertools from collections import deque def infinite_fun_generator(): seed = [0, 1, 1] dq = deque(maxlen=2) dq.extend(seed) yield from seed for i in itertools.count(1): if i % 2 == 0: dq.append(2 * dq[-1] - dq[-2] + 2) else: dq.append(3 * dq[-2]) yield dq[-1] def fun(l, r, p): funs = itertools.islice(infinite_fun_generator(), l, r + 1) summed_funs = itertools.accumulate(funs, lambda a, b: (a + b) % p) return deque(summed_funs, maxlen=1)[-1]
你可能有更好的機會在 Math.SE 中問這個問題,因為我現在不想做數學運算,但就像斐波那契數列一樣,可能有一個解析解,您可以用它來分析地計算序列的第 n 個成員無需迭代計算中間數,甚至可以通過分析推導出一個公式來計算恆定時間內的總和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.