Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python for循环中的内存错误_Python_Memory Management_Garbage Collection - Fatal编程技术网

Python for循环中的内存错误

Python for循环中的内存错误,python,memory-management,garbage-collection,Python,Memory Management,Garbage Collection,我现在正试图找到另一个大数中包含的最大素数 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 isprim

我现在正试图找到另一个大数中包含的最大素数

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()是一个检查数字是否为素数的函数(相当标准)。 这在某种程度上非常有效,我得到了一个记忆错误

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

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

有人知道如何解决这个问题吗

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

f = open("/root/number", "r")
pi = f.read()
f.close()
其中文件“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
def isprime(n):
n=abs(int(n))
如果n<2:
返回错误
如果n==2:
返回真值
如果不是n&1:
返回错误
对于范围(3,int(n**0.5)+1,2)内的x:
如果n%x==0:
返回错误
返回真值
回溯:

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
回溯(最近一次呼叫最后一次):
文件“/primal.py”,第36行,在
如果iPrime(数字)=真:
文件“/primal.py”,第24行,在iPrime中
对于范围(3,int(n**0.5)+1,2)内的x:
记忆者
使用而不是
范围
,最重要的是在
iPrime
中,这里:

for x in xrange(3, int(n**0.5)+1, 2):
xrange
不会在内存中创建整个列表,而range会创建整个列表,但在对结果进行迭代后,您不会使用这些结果

另一个提示:只需测试
isprime(n)
,就不需要查看它是否等于
True
,这就是
如果
所做的。:-)


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

在Python中,3.x
xrange()
消失了,而
range()
的行为就像过去的
xrange()
一样

引自:

range()现在的行为与以前的xrange()类似,只是它与 任意大小的值。后者已不复存在


isprime
的定义是什么?另外,您能否提供回溯输出?什么是
pi
?为什么不在范围(1023,-1,-1)内对maxlen使用
?并将错误行复制给我们,如果我想起来的话,Python会提供一些详细信息,让您了解错误发生在哪一行。顺便说一句,您不需要if语句中的“==True”部分。在您的情况下,构建字符串也非常昂贵且不必要。用整数代替
number=“”
number=pi[k]+number
,进行数学运算:
number=0
number=(number*10)+int(pi[k])
。然后,您还可以将
int(n)
放入
is\u prime
中。生成器和惰性求值通常对内存密集型的内容非常有用。非常好的提示,谢谢。虽然仍然不起作用,但我会自己继续搜索这些错误first@fragman:记住对你遇到的每个新问题使用一个新的SO问题(并搜索现有答案)。谢谢,我会记住这一点。因为我再也没有记忆体了,所以情况似乎就是这样。然而,程序仍然在与以前完全相同的点上死掉…@fragman:现在大概是因为不同的错误;这是一个新问题。:-)谢谢你的解释。我仍然在使用2.7,所以我将它改为xrange(),但当我切换到3时,我会记住这一点。x@fragman不客气。我最近开始使用v3(除了继续使用2.7之外),并发现“What's New..in 3”是一本有趣/信息丰富的读物。
if isprime(number):  # Only works if isprime(number) is boolean True
    ...