2

我目前正在尝试找到另一个大数中包含的最大素数。

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

isprime() 是一个检查数字是否为素数的函数(非常标准)。这工作得很好,直到我得到一个 MemoryError 的某个点。

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

我已经尝试过 gc.enable() 和 gc.collect() 没有任何积极的结果。

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

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

f = open("/root/number", "r")
pi = f.read()
f.close()

其中文件“数字”包含我想在其中找到素数的原始数字。

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

追溯:

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
4

2 回答 2

7

使用xrange代替range,最重要的是在isprime,这里:

for x in xrange(3, int(n**0.5)+1, 2):

xrange不会在内存中创建整个列表,而 range 会,但是在迭代它们之后您没有使用结果。

另一个提示:只测试isprime(n),不需要看它是否等于True那就是。:-)if

if isprime(number):  # Only works if isprime(number) is boolean True
    ...
于 2012-06-29T13:21:21.823 回答
4

如果这是在 Python v 2.x中,请使用xrange()而不是range(). range()在内存中一次生成一个列表,同时xrange()“按需”工作,每次需要时生成一个值。

在 Python 3.x xrange()中消失了,并且range()表现得像xrange()以前一样。

引用Python 3 中的新增功能

range() 现在的行为类似于 xrange() 过去的行为,除了它适用于任意大小的值。后者不再存在。

于 2012-06-29T13:22:48.050 回答