Performance 欧拉35号项目效率

Performance 欧拉35号项目效率,performance,Performance,欧拉计划的所有问题都应该在1分钟内通过一个程序解决。然而,我的解决方案的运行时间几乎为3分钟。我在网上看到的其他解决方案在概念上与我的类似,但运行时的速度是指数级的。有人能帮助我提高代码的效率/运行速度吗 谢谢 #genPrimes takes an argument n and returns a list of all prime numbers less than n def genPrimes(n): primeList = [2] number = 3 whil

欧拉计划的所有问题都应该在1分钟内通过一个程序解决。然而,我的解决方案的运行时间几乎为3分钟。我在网上看到的其他解决方案在概念上与我的类似,但运行时的速度是指数级的。有人能帮助我提高代码的效率/运行速度吗

谢谢

#genPrimes takes an argument n and returns a list of all prime numbers less than n
def genPrimes(n):
    primeList = [2]
    number = 3
    while(number < n):
        isPrime = True
        for element in primeList:
            if element > number**0.5:
                break
            if number%element == 0 and element <= number**0.5:
                isPrime = False
                break
        if isPrime == True:
            primeList.append(number)
        number += 2
    return primeList

#isCircular takes a number as input and returns True if all rotations of that number are prime
def isCircular(prime):
    original = prime
    isCircular = True
    prime = int(str(prime)[-1] + str(prime)[:len(str(prime)) - 1])
    while(prime != original):
        if prime not in primeList:
            isCircular = False
            break
        prime = int(str(prime)[-1] + str(prime)[:len(str(prime)) - 1])
    return isCircular

primeList = genPrimes(1000000)
circCount = 0
for prime in primeList:
    if isCircular(prime):
        circCount += 1
print circCount
#genPrimes接受一个参数n并返回一个所有小于n的素数的列表
def genPrimes(n):
primeList=[2]
数字=3
而(数量编号**0.5:
打破

如果number%element==0和element对代码的两次修改产生了一个非常快速的解决方案(在我的机器上大约2秒):

  • 生成素数是web上许多解决方案的常见问题。我将您的替换为
    rwh\u primes1
    来自:

    def genPrimes(n):
    筛子=[正确]*(n/2)
    对于x范围内的i(3,int(n**0.5)+1,2):
    如果筛[i/2]:
    筛子[i*i/2::i]=[False]*((n-i*i-1)/(2*i)+1)
    如果筛选[i]],则返回[2]+[2*i+1,表示xrange(1,n/2)中的i
    
    它大约快65倍(0.04秒)

  • 然而,我建议的最重要的步骤是过滤生成的素数列表。由于整数的每个循环移位版本都必须是素数,因此循环素数不能包含某些数字。例如,素数
    23
    ,很容易被视为无效候选,因为它包含
    2
    ,当这是最后一个数字时,表示可被2整除。因此,您可以通过以下简单方法删除所有这些不好的候选者:

    def filterPrimes(primeList):
    对于primeList[3:]中的i:
    如果str(i)中的“0”或str(i)中的“2”或str(i)中的“4”\
    或str(i)中的“5”或str(i)中的“6”或str(i)中的“8”:
    primeList.remove(i)
    返回素数表
    
    请注意,循环从第四个素数开始,以避免删除编号
    2
    5

    过滤步骤占用了大部分计算时间(约1.9秒),但将循环素数候选数从78498大幅减少到1113(=减少98.5%)

  • 最后一步,每个剩余候选人的循环,可以按照您的建议进行。如果愿意,可以将代码简化如下:

    circCount=sum(映射(isCircular,primeList))
    

    由于候选集减少,此步骤仅需0.03秒即可完成。

    如果您需要有关工作代码性能的反馈,您可能需要在我投票结束此问题时询问,因为有关改进工作代码的问题属于代码审查,所以请将此问题作为离题问题结束