我有两段代码,都是用埃拉托色尼筛法来求解到2000000的所有质数之和。第一段代码是原始代码,没有包装在任何函数中,如下所示:
N = 2000000
is_prime = (N + 1) * [True]
for candidate in range(2, N + 1):
if is_prime[candidate]:
print(candidate)
for witness in range(2 * candidate, N + 1, candidate):
is_prime[witness] = False
第二段代码将这个功能拆分成一个检查质数的函数和一个指定上限的for循环。代码如下:
def is_prime(n):
is_prime = (n + 1) * [True]
for candidate in range(2, int(sqrt(n)) + 1):
if is_prime[candidate]:
for witness in range(2 * candidate, n+1, candidate):
is_prime[witness] = False
return is_prime[n]
for candidate in range(2, LIMIT):
if is_prime(candidate):
print(candidate)
然而,拆分成检查素数的函数的代码块速度无限慢。我一直无法弄清这些代码块之间的差异。我做错了什么吗?