首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Project Euler #10 (Python)

Project Euler #10 (Python)
EN

Stack Overflow用户
提问于 2013-07-08 18:46:09
回答 9查看 12.5K关注 0票数 2

为什么我的算法找出小于200万的所有质数的和是如此的慢?我是一个相当初级的程序员,这是我想出的解决方案:

代码语言:javascript
运行
复制
import time

sum = 2
start = time.time()

for number in range(3, 2000000):
    prime = True
    for x in range(2, number):
        if number % x == 0:
            prime = False
    if prime:
        sum += number

print "Sum =", sum
end = time.time() - start
print "Runtime =", end

有谁能帮帮我吗?谢谢!

EN

回答 9

Stack Overflow用户

发布于 2013-07-08 18:56:03

您可以进行许多优化(而且应该这样做,因为对于project Euler中的许多问题,您将需要素数生成,因此拥有一个快速的实现可以简化以后的工作)。

看一看Atkin的筛子(以及相关的筛子) (http://en.wikipedia.org/wiki/Sieve_of_Atkin),以了解如何通过蛮力(即算法)来加速素数生成。

然后看看对这篇S.O.-post (Fastest way to list all primes below N)的精彩回答,它记录了许多素数生成算法/实现。

票数 4
EN

Stack Overflow用户

发布于 2013-08-14 20:52:19

你的算法使用试除法,这是非常慢的。一种更好的算法是使用Eratosthenes筛子:

代码语言:javascript
运行
复制
def sumPrimes(n):
    sum, sieve = 0, [True] * n
    for p in range(2, n):
        if sieve[p]:
            sum += p
            for i in range(p*p, n, p):
                sieve[i] = False
    return sum

print sumPrimes(2000000)

这应该会在不到一秒的时间内运行。如果你对质数编程感兴趣,我在我的博客中谦虚地推荐这个essay

票数 4
EN

Stack Overflow用户

发布于 2013-07-08 19:29:32

没有人指出这一点,但是在Python2.x中使用range非常慢。使用xrange instaed,在这种情况下,这应该会给你带来巨大的性能优势。

请参阅this question.

此外,您不必循环,直到您检查的数字,检查直到round(sqrt(n)) + 1是足够的。(如果大于它的平方的数字除以它,那么您一定已经注意到有一个比平方更小的数字。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17524685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档