Python中大型列表的内存管理

zw3*_*324 3 python memory-management list

今天我用一个包含64000000个条目的数组/列表编写了一个程序.然而,当sigma=[1]*64000000使用Python 编写它运行正常,但稍后,随着程序计算,我的Ubuntu冻结 - 没有任何反应输入,甚至鼠标移动.我试了两次,结果是一样的.

在C++中实现时,long long sigma[64000000]保持良好并且运行速度非常快.

有没有什么理由说我的程序会在运行过程中冻结,而不是在开始时崩溃?

编辑:要回复下面的克里斯,我的代码直到几个循环之后才冻结.

谢谢你们!

对于那些有兴趣看到代码的人来说,这就是程序,一个蛮力的Project Euler 211:

def e211():
ans=0
sigma=[1]*64000000
for i in range(2,64000000):
    j=i;
    if ((j%1000==0) or (j<100)):
        print(j)
    q=i*i
    while j<64000000:
        sigma[j]+=q
        j+=i
for i in range(1,64000000):
    j=int(sqrt(sigma[i]))
    if j*j==sigma[i]:
        ans+=i
if __name__=='__main__':
    print(e211())
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 7

Python列表是对象列表.Python中的数字本身就是一个对象,占用的存储量比long long在C++中表示一个64位所需的存储量要多一些.特别是,Python中透明地处理超过32位,这最终以一个更大的数字很多更多的空间比一个简单的整数.

您可能会发现标准Python array模块很有用.它提供对兼容指定大小的统一数组的Python兼容访问.(但是,我注意到它不提供64位整数类型.)