繁体   English   中英

Memory 管理Python中的大列表

[英]Memory management of large lists in Python

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

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

除了在开始时崩溃之外,我的程序是否有任何原因会在运行过程中冻结?

编辑:要在下面回复 Chris,我的代码直到几个循环后才冻结。

谢谢你们!

对于那些有兴趣查看代码的人来说,这是一个程序,一个蛮力的 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())

Python 列表是对象列表。 Python 中的数字本身就是 object,它占用的存储空间比在 C++ 中表示long long所需的 64 位要多。 特别是,Python 透明地处理大于 32 位的数字,这最终比简单的 integer 占用更多的空间。

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

range(1,64000000):

这一行创建了一个大小为 64000000 的完整列表,因此现在您在 memory 中有两个该大小的列表。 请改用xrange

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM