这两个非常相似的代码具有非常不同的速度。我不明白为什么。第一个比第二个(5秒)慢得多(2分钟)。
from numpy import sqrt
primes = [2]
for i in range(3, 1000000):
sq = int(sqrt(i))
aux = False
for j in primes:
if j>sq:
aux = True
elif i%j==0:
break
if aux:
primes.append(i)
=============================================== ===================
def isPrime(p, primes):
bound = numpy.sqrt(p)
i = 0
while(primes[i] <= bound):
if p % primes[i] == 0:
return False
i += 1
return True
def compute_primes(bound):
primes = []
primes.append(2)
for n in range(3, bound):
answer = isPrime(n, primes)
if answer:
primes.append(n)
return primes
compute_primes(1000000)
答案 0 :(得分:5)
性能差异的原因是,当第二个版本达到上限时,第一个版本不会破坏内部循环。假设两个版本都在检查11
是否为素数。第一个版本将为所有较小的素数(2, 3, 5, 7)
运行内部循环,而第二个版本将仅检查小于或等于sqrt(11)
:(2, 3)
的值。
如果在达到上限时将第一个版本更改为中断,则它们的运行时间大致相同:
if j > sq:
aux = True
break