所以我做了一个欧拉项目问题试图结合Eratosthenes的Sieve来找到一个数字的最大素数因子,但是当我尝试填充我的初始哈希表时,它会慢慢爬行并吃掉那些值得一试的价值RAM并接管我的CPU。有谁能解释为什么?我意识到代码本身可能是subpar
allNums = {}
maxNum=600851475143
maxFactor=0
#fill dictionary, slows to a crawl here
for x in xrange(2,maxNum+1):
allNums[x]=True
#sieve of Erastosthenes
for x in xrange(2,len(allNums)):
y=x
if allNums[x]:
y **= 2
while y<=maxNum:
if allNums[y]:
allNums.pop(y)
y+=x
#largest prime factor
for x in allNums:
if maxNum%x==0 and x>maxFactor:
maxFactor=x
print x
答案 0 :(得分:0)
那么,你分配一个巨大的列表(maxNum * 4字节,右)?即使它是一个字典,你可以在那里搜索log(N)的复杂性,它仍然需要花费大量时间(更重要的是,内存)。如此庞大的列表甚至可能不适合您的RAM,因此您的操作系统必须模仿额外的内存(这意味着只需更长的访问时间即可读取该数据)。
顺便说一句,这就是你的问题是如何完成的(不是非常有效 - 我的机器需要几秒钟) - 但是这个想法类似于Eratosphene筛子,除了一个小的优化,即不继续如果x*x > maxNum
。
maxNum=600851475143
maxFactor=0
x = 1
while True:
(quotient, remainder) = divmod(maxNum, x)
if x>quotient:
break
if remainder==0:
maxFactor=x
x +=1
print maxNum, maxFactor