python中超出的内存限制

时间:2019-06-25 12:03:52

标签: python memory python-3.5

我正在解决一个需要整数列表或大小为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) 

显示超出内存限制,最大内存使用量为306612KiB

1 个答案:

答案 0 :(得分:0)

这里有两个观察结果:

  • 您不需要同时存储所有数字,可以使用双端队列和生成器功能来生成数字,方法是仅跟踪生成的最后三位数而不是整个序列。

    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个分析序列的成员,而不必迭代计算中间数,甚至可以分析得出一个公式,以便在恒定时间内计算总和。