Python 如何加快基本查找过程?
我在做Euler项目的第7题时遇到了一个问题。我的代码需要很长时间才能完成。这是我的密码Python 如何加快基本查找过程?,python,loops,primes,Python,Loops,Primes,我在做Euler项目的第7题时遇到了一个问题。我的代码需要很长时间才能完成。这是我的密码 def Problem7(): num=0 p=0 而p
def Problem7():
num=0
p=0
而p<10002:
素数=真
对于范围内的i(2,num):
如果(num%i==0):
素数=假
如果为素数:
打印(个)
p=p+1
num=num+1
问题7()
我如何使它更快?还有其他方法吗?你应该让你的生活更轻松,并在最后打印素数,我怀疑p变量正在存储这个素数 如评论中所述,您可以使用更智能的算法消除大量计算 1:检查数字是否为偶数(num%2)(如果是,则不是素数) 2:当除数小于或等于平方根且素数==真时,测试除数 3:如果仍然不是素数,则增加2,以便只测试奇数(所有偶数都使用num%2进行检查) 如果您想获得超高效,每个非素数的数字都至少有一个素数因子,因此您可以存储在数组中找到的每个素数,并且只检查数组中最高的素数。。。但这是很多额外的编码,对于这个问题来说是不必要的。使用上述逻辑,我在测试运行的几秒钟内找到了前10000个素数
如果你想到数字100,你的逻辑测试99个可能的除数。上述逻辑仅测试2次,然后停止。求平方根的最坏情况只有2,3,5,7,9。。。5次计算,而不是99次。我使用以下方法检查数字是否为素数(以0m0.612s为单位运行):
导入数学
def是_prime(num):
如果num==0或num==1:
返回错误
如果num==2:
返回真值
温度=2
当温度<数学sqrt(数值)+1时:
如果num%temp==0:
返回错误
温度+=1
返回真值
这是python2.x还是python3.x?对于python2.x来说,一个真正快速的优化是从range
切换到xrange
。在这个实现中,有几件事情没有多大意义:(1)在查找除数时,您可以停在正在测试的数字的平方根处。如果任何大于这个的东西是一个除数,那么必须有一个相应的较小的除数。(2) 找到除数后,立即退出循环(即,break
)。一旦你找到了,为什么还要继续寻找呢?(3) 唯一需要作为除数测试的偶数是2。之后,您可以跳过所有偶数。其他的速度改进是可能的,但我列出的那些都是微不足道的。将每一个数字除以所有的数字,然后对大素数来说,这需要很长时间。
import math
def is_prime(num):
if num == 0 or num == 1:
return False
if num == 2:
return True
temp = 2
while temp < math.sqrt(num) + 1:
if num % temp == 0:
return False
temp += 1
return True