Python中大列表的内存管理

3 投票
2 回答
3412 浏览
提问于 2025-04-16 18:35

今天我写了一个程序,里面用了一个有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())

2 个回答

2
range(1,64000000):

这一行代码创建了一个大小为64000000的完整列表,所以现在你在内存中有两个这么大的列表。建议使用xrange来代替。

7

Python中的列表其实是一个包含各种对象的集合。在Python里,数字本身也是一种对象,它占用的存储空间比C++中表示一个long long类型的64位要多一些。特别是,Python可以自动处理比32位更大的数字,这些大数字会占用比普通整数多得多的空间。

你可能会觉得Python的标准array模块很有用。这个模块可以让你在Python中方便地使用指定大小的整型数组。(不过,我要提醒一下,它并没有提供64位整数类型。)

撰写回答