为什么 Project Euler 的问题 10 需要这么长时间才能显示输出?
Why does it take so long to show the output of problem 10 of Project Euler?
我在 Python 中写了一些代码来解决 Project Euler 的问题 10:'Find the sum of all the primes below two million'。我的代码有效,但不是最佳的。显示输出需要很多时间。
当我尝试解决 20000 以下素数的问题时,它起作用了。当我将它更改为 200 000 或 200 万时,它不会显示输出,它只是在计算,这会花费很多时间,而我预计它会更快,因为计算并不太难。我从来没有输出过。它几乎看起来像是一个无限循环。有谁知道问题出在哪里?
这是我的代码:
answer = 0
for number in range (2, 2000000):
if number > 1:
for i in range (2, number):
if number % i == 0:
break
else:
answer += number
print(answer)
如评论中所述,尝试更快的算法,例如 Sieve of Eratosthenes:
answer = 0
n = 2_000_000
sieve = set()
for x in range(2, n + 1):
if x not in sieve:
answer += x
sieve.update(range(x * x, n + 1, x))
print(answer)
用法:
$ time python sieve.py
142913828922
python sieve.py 0.34s user 0.03s system 98% cpu 0.376 total
@Bakuriu 建议的更好版本:
answer = 0
n = 2_000_000
# Add 2 the only even prime number.
answer += 2
sieve = set()
# Check only odd numbers.
for x in range(3, n + 1, 2):
if x not in sieve:
answer += x
sieve.update(range(x * x, n + 1, 2 * x))
print(answer)
用法:
$ time python sieve_better.py
142913828922
python sieve_better.py 0.19s user 0.02s system 98% cpu 0.211 total
我在 Python 中写了一些代码来解决 Project Euler 的问题 10:'Find the sum of all the primes below two million'。我的代码有效,但不是最佳的。显示输出需要很多时间。
当我尝试解决 20000 以下素数的问题时,它起作用了。当我将它更改为 200 000 或 200 万时,它不会显示输出,它只是在计算,这会花费很多时间,而我预计它会更快,因为计算并不太难。我从来没有输出过。它几乎看起来像是一个无限循环。有谁知道问题出在哪里?
这是我的代码:
answer = 0
for number in range (2, 2000000):
if number > 1:
for i in range (2, number):
if number % i == 0:
break
else:
answer += number
print(answer)
如评论中所述,尝试更快的算法,例如 Sieve of Eratosthenes:
answer = 0
n = 2_000_000
sieve = set()
for x in range(2, n + 1):
if x not in sieve:
answer += x
sieve.update(range(x * x, n + 1, x))
print(answer)
用法:
$ time python sieve.py
142913828922
python sieve.py 0.34s user 0.03s system 98% cpu 0.376 total
@Bakuriu 建议的更好版本:
answer = 0
n = 2_000_000
# Add 2 the only even prime number.
answer += 2
sieve = set()
# Check only odd numbers.
for x in range(3, n + 1, 2):
if x not in sieve:
answer += x
sieve.update(range(x * x, n + 1, 2 * x))
print(answer)
用法:
$ time python sieve_better.py
142913828922
python sieve_better.py 0.19s user 0.02s system 98% cpu 0.211 total