Python:一种在给定范围内生成质数的简洁方法



最近我读到一个用Python生成质数列表的非常紧凑的方法

#'prime' should be a pre-defined upper bound of the range
filter(lambda prime:all(prime%num for num in range(2,prime)),range(2,prime))

proscons是什么?它是Pythonic的吗?

我个人的想法是它的可读性和非常简化,我不确定如果这是一个很好的方式来编码,我不肯定的代码是有效的

对于prime = 10000,该代码执行78021次除法,而传统方法不超过2302次。

http://ideone.com/X0MhGO

您的方法可以通过只检查奇数并在sqrt(x)停止来改进:

primes = [2] + filter(lambda p: all(p % n for n in range(3, int(sqrt(p)) + 1, 2)), range(3, max, 2))

这仍然比"传统"算法差,但比原来的算法好得多(2351div vs 78021)。

优点和缺点主要是算法而不是语法。这段代码使用naïve方法生成这些素数,虽然您可以对其进行一些优化,但如果遇到性能问题,最好使用一个完善的算法。否则,这并不重要,尽管我个人会把上面的代码写成一个生成器表达式:

(cand for cand in range(2,upper_limit) if all(cand%num for num in range(2,cand)))

(注意:你有两个不相关的变量都命名为prime在你的原始代码,所以我重命名他们,我认为合适)

缺点:生成器是更好的选择。我还发现它相当慢。

优点:它把所有质数放到一个列表中,我想这是一个优点。

以下是我在质数周围使用的函数

有更好的方法,这个函数比较慢,原因如下:

  • 当你可以化简为2 × 2时,它是一个接一个的,因为除了2以外的所有偶数都不是素数

  • 同时,它一直循环到最后的数字,当它永远不会有超过平方根的因子

这是一个更好的函数来检查一个数字是否是素数的例子。

如果你至少在寻找速度,这些是主要问题。

相关内容

最新更新