Performance 欧拉35号项目效率
欧拉计划的所有问题都应该在1分钟内通过一个程序解决。然而,我的解决方案的运行时间几乎为3分钟。我在网上看到的其他解决方案在概念上与我的类似,但运行时的速度是指数级的。有人能帮助我提高代码的效率/运行速度吗 谢谢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
#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秒即可完成。如果您需要有关工作代码性能的反馈,您可能需要在我投票结束此问题时询问,因为有关改进工作代码的问题属于代码审查,所以请将此问题作为离题问题结束