为什么Python在这段代码中慢慢爬行?

时间:2014-03-27 19:43:59

标签: python

所以我做了一个欧拉项目问题试图结合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

1 个答案:

答案 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