今天我用一个包含64000000条目的数组/列表编写了一个程序。但是,当使用Python编写sigma=[1]*64000000
时它运行正常,但稍后,随着程序的计算,我的Ubuntu会冻结 - 对输入没有任何反应,甚至没有鼠标移动。我试了两次,结果是一样的。
在C ++中实现时,long long sigma[64000000]
保持良好状态并且运行速度非常快。
除了开始崩溃之外,我的程序是否有任何理由在运行过程中冻结?
编辑:要回复下面的Chris,我的代码在几个循环之后才会冻结。
谢谢大家!
对于那些有兴趣看到代码的人来说,这就是程序,一个蛮力的项目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())
答案 0 :(得分:7)
Python列表是对象的列表。 Python中的数字本身就是一个对象,占用的存储量比在C ++中表示long long
所需的64位要多。特别是,Python透明地处理大于32位的数字,最终比一个简单的整数占用 lot 更多的空间。
您可能会发现标准Python array
模块很有用。它提供对兼容指定大小的统一数组的Python兼容访问。 (但是,我注意到它不提供64位整数类型。)
答案 1 :(得分:2)
range(1,64000000):
此行创建一个大小为64000000的完整列表,因此现在您在内存中有两个该大小的列表。请改用xrange
。