【发布时间】:2015-12-09 02:41:13
【问题描述】:
我正在尝试 Project Euler 的第 10 题,它是所有低于 2,000,000 的素数的总和。我曾尝试使用 Python 实现 Erasthotenes 筛,并且我编写的代码非常适用于 10,000 以下的数字。
但是,当我试图找到更大数字的素数总和时,代码运行时间太长(找到高达 100,000 的素数总和需要 315 秒)。该算法显然需要优化。
是的,我看过这个网站上的其他帖子,比如Fastest way to list all primes below N,但是那里的解决方案对代码的工作原理几乎没有解释(我仍然是初学者)所以我无法真正学习来自他们。
有人可以帮我优化我的代码,并清楚地解释它是如何工作的吗?
这是我的代码:
primes_below_number = 2000000 # number to find summation of all primes below number
numbers = (range(1, primes_below_number + 1, 2)) # creates a list excluding even numbers
pos = 0 # index position
sum_of_primes = 0 # total sum
number = numbers[pos]
while number < primes_below_number and pos < len(numbers) - 1:
pos += 1
number = numbers[pos] # moves to next prime in list numbers
sum_of_primes += number # adds prime to total sum
num = number
while num < primes_below_number:
num += number
if num in numbers[:]:
numbers.remove(num) # removes multiples of prime found
print sum_of_primes + 2
正如我之前所说,我是编程新手,因此对任何复杂概念的彻底解释将不胜感激。谢谢。
【问题讨论】:
-
您在测试 num 时创建
numbers[:]的副本的任何原因? -
从您正在迭代的列表中删除项目是不安全的,但是您的代码没有这样做,因此正如 champion 所指出的那样,您不需要在此处复制
numbers。
标签: python optimization primes