Python 中的埃拉托色尼筛法非常慢
Sieve of Eratosthenes in Python very slow
我在 Python 中编写了一个程序,它找到给定数字 (n) 以下的所有质数,并将它们相加(以回答 欧拉计划问题 10)。为了解决这个问题,我需要将所有小于 2,000,000 的素数相加。我的程序有效,但似乎效率很低(当 n = 2,000,000 时,即使在 30 分钟后也不会显示答案)。我找到了另一个程序,它的速度越来越快,尽管我似乎无法找出是什么让我的程序比我找到的程序慢。这是两个程序:
慢程序(我写的那个):
def print_sum(n):
prime_array = {}
sum = 0
for i in range(2, n+1):
prime_array[i] = 1
prime_array[0] = 0
prime_array[1] = 0
for j in range(2, int(math.sqrt(n)) + 1):
if prime_array[j] == 1:
for k in range(2, n + 1):
prime_array[j*k] = 0
for x in prime_array:
if prime_array[x] == 1:
sum = sum + x
print sum
print_sum(2000000)
快速程序:
n = 2000000
prime_array = [True] * n
sum = 0
def mark(prime_array, x):
for i in xrange(x+x, len(prime_array), x):
prime_array[i] = False
for x in xrange(2, int(len(prime_array)** .5) + 1):
if prime_array[x]: mark(prime_array, x)
for y in xrange(2, n):
if prime_array[y]:
sum = sum + y
print sum
提前致谢!
for k in range(2, n + 1):
prime_array[j*k] = 0
看来您正在超出此循环的有用范围。假设 j
是 999,n
是 1,000,000。那么 prime_array
将拥有高达 999,000,000 的键,即使您只关心从 0 到 1,000,000 的键。
尝试将您的赋值限制在 n 以下。
for k in range(2*j, n + 1, j):
prime_array[k] = 0
我在 Python 中编写了一个程序,它找到给定数字 (n) 以下的所有质数,并将它们相加(以回答 欧拉计划问题 10)。为了解决这个问题,我需要将所有小于 2,000,000 的素数相加。我的程序有效,但似乎效率很低(当 n = 2,000,000 时,即使在 30 分钟后也不会显示答案)。我找到了另一个程序,它的速度越来越快,尽管我似乎无法找出是什么让我的程序比我找到的程序慢。这是两个程序:
慢程序(我写的那个):
def print_sum(n):
prime_array = {}
sum = 0
for i in range(2, n+1):
prime_array[i] = 1
prime_array[0] = 0
prime_array[1] = 0
for j in range(2, int(math.sqrt(n)) + 1):
if prime_array[j] == 1:
for k in range(2, n + 1):
prime_array[j*k] = 0
for x in prime_array:
if prime_array[x] == 1:
sum = sum + x
print sum
print_sum(2000000)
快速程序:
n = 2000000
prime_array = [True] * n
sum = 0
def mark(prime_array, x):
for i in xrange(x+x, len(prime_array), x):
prime_array[i] = False
for x in xrange(2, int(len(prime_array)** .5) + 1):
if prime_array[x]: mark(prime_array, x)
for y in xrange(2, n):
if prime_array[y]:
sum = sum + y
print sum
提前致谢!
for k in range(2, n + 1):
prime_array[j*k] = 0
看来您正在超出此循环的有用范围。假设 j
是 999,n
是 1,000,000。那么 prime_array
将拥有高达 999,000,000 的键,即使您只关心从 0 到 1,000,000 的键。
尝试将您的赋值限制在 n 以下。
for k in range(2*j, n + 1, j):
prime_array[k] = 0