我在Python程序中使用了Eratosthenes的Sieve来找到素数因子。这是代码 -
import time
import sys
p=[]
def sieve(n):
p.append(False) # 0 isn't prime
p.append(False) # 1 isn't prime
i=2
while (i<=n):
if i%2==0:
p.append(False)
else:
p.append(True)
i+=1
#creating a sieve and putting even numbers as false and odd as true
#Even numbers can never be prime except 2 which will now become true
p[2]=True
sq=int(n**0.5) #storing square root of n
i=3
while (i<=sq):
k=i*i
while k<=n:
p[k]=False
k+=(2*i)
i+=2
def primefactors(n,x):
print "The prime factors are : "
if(n%2==0):
print 2
while(n%2==0):
n/=2
i=3
while(i<len(p)):
if(n==1):
break
if(p[i]):
if(n%i==0):
print i
while(n%i==0):
n/=i
i+=2
if n==x:
print None
elif n!=1:
print n
def main ():
print "Enter number to be factored "
n=raw_input()
n=int(n)
start=time.clock()
sieve(n**0.5+1)
primefactors(n,n)
end=time.clock()
print "Seconds : "+str(end-start)
main()
现在,当我尝试18位数字时,我在创建列表时收到内存错误。但是,Windows任务管理器仅显示1.48 GB RAM,而我有大约2.2 GB的可用RAM。 这背后的原因是什么?
我在发生内存错误时添加了任务管理器的屏幕截图。(无法在此处发布图片,所以这里是链接 - Image)
另外,我知道还有其他方法可以更快地分析质数,但我想知道为什么在RAM被完全利用之前发生这种内存错误。
答案 0 :(得分:0)
因此,32位系统上的python列表的最大大小是 536,870,912个元素。
答案 1 :(得分:0)
python为你的列表保留了一个连续的空间。如果您的列表已增长到保留空间,则python会分配更大的空间并将您的元素复制到新位置。当您的列表增长到可用内存的一半时,此调整大小最新失败。