【问题标题】:Prime numbers using generators in Python? [duplicate]在 Python 中使用生成器的素数? [复制]
【发布时间】:2016-07-08 09:25:37
【问题描述】:

我写了这个简单的python函数来计算:

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中的生成器..

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

【问题讨论】:

  • 为什么要检查每个数字?
  • 希望改进的完整且功能正常的代码块可以指向Code Review Stack Exchange。请务必在发布之前查看该网站的帮助中心

标签: python


【解决方案1】:

首先,我建议你使用一个更好的函数来检查一个数字是否是素数。 这是一个更好的修改,来自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

其次,您需要了解生成器的实际作用。 Jeff Knupp 再次完美地解释了这一点。 简而言之,生成器是一个不会“返回”的函数,它只是“屈服”并在调用 next() 方法时收回控制权。 所以在函数过程中创建的变量不会丢失,并且通过不一次又一次地创建函数中定义的变量来节省内存。

然后您可以继续求解 Euler 10,链接中也对此进行了说明。 :)

祝其余的欧拉好运!

【讨论】:

    【解决方案2】:

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

    一般的想法是“标记”所有合数(不是素数),留下素数。它非常高效,因为我的 python 实现运行时间约为 3.5 秒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-20
      • 2017-08-06
      • 2017-05-30
      • 2016-01-08
      • 1970-01-01
      • 2015-10-28
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多