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.xxrange()
消失了,而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
...