如何避免MemoryError

时间:2015-01-28 16:49:58

标签: python list memory python-3.4

我正试图找到一个数字的最大素数因子。这是我的代码,但我不知道我的代码是否正常工作,因为我一直在收到MemoryError;

lst = []
for x in range(3,round(600851475143**0.5)+1):
    for y in range(2,x+1):
        if x%y==0:
            for z in range(2,x+1):
                if x%z!=0:
                    lst.append(x)
print (max(lst))

这是追溯;

>>> 
Traceback (most recent call last):
  File "C:--------", line 19, in <module>
    lst.append(x)
MemoryError
>>> 

经过20-30秒的过程,我收到了这个错误。如何避免这个错误?

编辑:实际上,我猜它可能是MemoryError,所以当你看到我放入第一个range函数时,该数字600851475143**0.5的平方根。然后我使用round来避免float。但我仍然得到了MemoryError。

2 个答案:

答案 0 :(得分:1)

if x%y==0:
    for z in range(2,x+1):
        if x%z!=0:
            lst.append(x)

我猜你在这里要做的是,如果x是素数,请将x附加到lst。但是你实际上在做的是,将x追加到每个小于x的数字,而不是x的因子。防爆。 6将被追加两次,因为4和5都不是6的因子。

如果您只想在所有 z不是x的因子时附加x,请尝试:

if x%y==0:
    if all(x%z != 0 for z in range(2, x)):
        lst.append(x)

答案 1 :(得分:0)

来自python文档:

  

异常MemoryError

     

当操作耗尽内存时引发,但情况仍然可能被挽救(通过删除一些对象)。关联值是一个字符串,表示内存中耗尽了哪种(内部)操作。请注意,由于底层内存管理体系结构(C的malloc()函数),解释器可能无法始终从这种情况中完全恢复;然而它引发了一个异常,以便可以打印堆栈回溯,以防止失控程序。

你在lst中添加了太多元素。

有效的素数因子分解算法比您编写的算法更有效,可以在wikipedia上查找。