有任何简化此代码的想法吗?花费的时间太长,但这也许是因为我的限制(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)
答案 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