在Python中使用生成器的素数?

时间:2016-03-21 17:56:26

标签: python

我将这个简单的python函数写入calc:

def isPrime(number):
    if number == 2:
        return True

    elif number > 1 and number % 2 != 0:
        for current in range(3, number):
            if number % current == 0:
                return False

        return True

我称之为打印出所有素数的总和,从1到200万,如项目euler #10

然而它非常慢,我想知道我是否可以使用发电机解决同样的问题?但我并不完全理解python中的生成器..

如何更有效地解决这个问题的任何帮助将不胜感激!谢谢:))

2 个答案:

答案 0 :(得分:0)

首先,我建议您使用更好的功能来检查数字是否为素数。 这是一个更好的修改,来自https://jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/,这是一个很好的 Python中关于生成器的解释。

import math

def is_prime(number):
    while True:
        if number == 2:
            return True
        elif number > 1 and number % 2 != 0:
            for current in range(3, int(math.sqrt(number) + 1), 2):
                if number % current == 0:
                    return False
            return True
        return False

其次,您需要了解Generator实际上做了什么。 Jeff Knupp再次完美地解释了这一点。 简而言之,发电机是一种不会“返回”的功能。它只是"产量"并在调用next()方法时收回控制权。 因此,在函数期间创建的变量不会丢失,并且不会一次又一次地创建函数中定义的变量来保存内存。

然后你可以继续解决欧拉10,这也在链接中解释。 :)

祝欧洲其他成员好运!

答案 1 :(得分:0)

对此问题的另一个攻击角度是尝试不同的算法,而不是尝试优化当前的方法。了解有关生成器的更多信息,但您也可以尝试使用sieve来解决此问题,这可能非常有效。

一般的想法是"标记"所有复合数(不是素数),留下素数。它非常有效,因为我的python实现运行在~3.5秒