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())
2 个回答
2
range(1,64000000):
这一行代码创建了一个大小为64000000的完整列表,所以现在你在内存中有两个这么大的列表。建议使用xrange
来代替。
7
Python中的列表其实是一个包含各种对象的集合。在Python里,数字本身也是一种对象,它占用的存储空间比C++中表示一个long long
类型的64位要多一些。特别是,Python可以自动处理比32位更大的数字,这些大数字会占用比普通整数多得多的空间。
你可能会觉得Python的标准array
模块很有用。这个模块可以让你在Python中方便地使用指定大小的整型数组。(不过,我要提醒一下,它并没有提供64位整数类型。)