Python for循环中的内存错误

fra*_*man 2 python garbage-collection memory-management

我目前正试图找到另一个大数字中包含的最大素数.

maxlen = 1024
for i in range(1023, -1, -1):
    maxlen -= 1
    number = ""
    for k in range(maxlen, -1, -1):
            number = pi[k] + number
            if isprime(number) == True:
                    print number
Run Code Online (Sandbox Code Playgroud)

isprime()是一个检查数字是否为素数的函数(非常标准).这非常有效,直到我得到一个MemoryError.

这不是因为函数检查的数字太大,因为它发生在第一个for循环的第6次运行周围.

我已经尝试过gc.enable()和gc.collect()而没有任何正面结果.

有谁知道如何解决这个问题?

编辑:根据请求定义pi和isprime():

f = open("/root/number", "r")
pi = f.read()
f.close()
Run Code Online (Sandbox Code Playgroud)

文件"number"包含我想要找到素数的原始数字.

def isprime(n):
    n = abs(int(n))
    if n < 2:
            return False
    if n == 2:
            return True
    if not n & 1:
            return False
    for x in range(3, int(n**0.5)+1, 2):
            if n % x == 0:
                    return False
    return True
Run Code Online (Sandbox Code Playgroud)

追溯:

Traceback (most recent call last):
  File "./primal.py", line 36, in <module>
    if isprime(number) == True:
  File "./primal.py", line 24, in isprime
    for x in range(3, int(n**0.5)+1, 2):
MemoryError
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

在这里使用xrange而不是range最重要的是isprime:

for x in xrange(3, int(n**0.5)+1, 2):
Run Code Online (Sandbox Code Playgroud)

xrange 不会在内存中创建整个列表,而范围会创建,但在迭代后不会使用结果.

另一个技巧:刚刚测试isprime(n),没有必要看它是否等于True,那是什么if .:-)

if isprime(number):  # Only works if isprime(number) is boolean True
    ...
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,生成器和惰性评估对于内存密集型内容非常有用. (2认同)