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)
在这里使用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)
| 归档时间: |
|
| 查看次数: |
5410 次 |
| 最近记录: |