两个非常相似的代码,用于在n但非常不同的CPU时间内生成素数

时间:2016-04-08 15:12:52

标签: python time-complexity primes

这两个非常相似的代码具有非常不同的速度。我不明白为什么。第一个比第二个(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)

1 个答案:

答案 0 :(得分:5)

性能差异的原因是,当第二个版本达到上限时,第一个版本不会破坏内部循环。假设两个版本都在检查11是否为素数。第一个版本将为所有较小的素数(2, 3, 5, 7)运行内部循环,而第二个版本将仅检查小于或等于sqrt(11)(2, 3)的值。

如果在达到上限时将第一个版本更改为中断,则它们的运行时间大致相同:

if j > sq:
    aux = True
    break