Python中的Eratosthenes筛非常慢
我已经用Python编写了一个程序,它可以找到给定数字(n)下面的所有素数,并对它们进行求和(以回答Project Euler的问题10)。为了解决这个问题,我需要将所有的素数相加到2000000以下。我的程序运行正常,但效率似乎很低(当n=2000000时,即使在30分钟后也不会显示答案)。我找到了另一个速度越来越快的程序,尽管我似乎无法找出是什么让我的程序比我找到的程序慢。以下是两个程序: 慢程序(我写的那一个):Python中的Eratosthenes筛非常慢,python,algorithm,performance,sieve-of-eratosthenes,Python,Algorithm,Performance,Sieve Of Eratosthenes,我已经用Python编写了一个程序,它可以找到给定数字(n)下面的所有素数,并对它们进行求和(以回答Project Euler的问题10)。为了解决这个问题,我需要将所有的素数相加到2000000以下。我的程序运行正常,但效率似乎很低(当n=2000000时,即使在30分钟后也不会显示答案)。我找到了另一个速度越来越快的程序,尽管我似乎无法找出是什么让我的程序比我找到的程序慢。以下是两个程序: 慢程序(我写的那一个): def print_sum(n): prime_array = {
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
快速程序:
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
为1000000。然后prime_数组
将拥有高达999000000的密钥,即使您只关心从0到1000000的密钥
尝试将赋值限制在n以下
for k in range(2*j, n + 1, j):
prime_array[k] = 0
阅读
xrange
和range
之间的差异。检查限制
和步骤
。