簡體   English   中英

Python 中超出內存限制

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM