质数和

时间:2018-09-10 16:16:45

标签: python

有任何简化此代码的想法吗?花费的时间太长,但这也许是因为我的限制(2000000)太高了。

def is_prime(x):
    for i in range(2, x):
        if x == 2:
            break
        elif x % i == 0:
            return False
            break


total = 0
for num in range(2, 2000000):
    if is_prime(num) != False:
        print(num)
        total += num

print(total)

2 个答案:

答案 0 :(得分:1)

要稍微加快速度,请将上限设为x的平方根。
如果在此之前没有其他因素,那么之后也将没有其他因素。

答案 1 :(得分:0)

在函数is_prime()中,您正在使用一种非常蛮力的方法来详尽地检查每个可能的数字,以查看其是否为x的除数。如评论中所述,您只能检查最多sqrt(x),因为乘法的另一半将已经检查。另外,很常见的是通过检查x是否只能被2整除一次,然后仅对奇数进行迭代来将计算数量减少一半。仅通过这两个修改,您就可以提高速度。

import math

def is_prime(x):
    if x == 2: #2 is prime
        return True
    if x % 2 == 0: #divisible by 2
        return False
    for i in range(3,int(math.sqrt(x)),2): #only odd numbers up to sqrt(x) starting from 3
        if x % i == 0: #divisible by i
            return False
    return True #we made it through the loop without finding a divisor

使用素数筛和numpy生成直至x的所有素数的示例可能类似于:

import numpy as np

sieve = np.ones(x,bool)
sieve[:2] = False #0 and 1 are not prime
for i in range(2,int(x**.5)):
    if sieve[i]: #`i` is prime therefore mark all multiples of i as not prime
        sieve[i*2::i] = False
primes = np.where(sieve)[0] #extract primes as indices of `primes` that are true