Python:在给定范围内生成素数的紧凑方法

时间:2012-12-24 06:04:53

标签: python lambda primes

最近我读了一个非常简洁的方法来生成素数列表,用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吗?

我个人的想法是它的可读性和非常简化,我不确定它是否是一种很好的编码方式,而且我并不认为代码是有效的

4 个答案:

答案 0 :(得分:3)

对于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))

这仍然比“传统”算法更糟糕,但比原来算法要好得多(2351 divs vs 78021)。

答案 1 :(得分:1)

优点和缺点主要是算法而不是句法。此代码使用简单的方法生成这些素数,虽然您可以对其进行一些优化,但如果遇到性能问题,最好使用well established algorithm。否则,它并不重要,尽管我个人会将上面的代码编写为生成器表达式:

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

(注意:您的原始代码中有两个名为prime的不相关变量,因此我按照我认为合适的方式重命名了它们。

答案 2 :(得分:0)

缺点:发电机将是更好的选择。我也觉得它很慢。

优点:它将所有素数放入列表中,我想这是一个加号。

以下是我在素数周围使用的functions

答案 3 :(得分:0)

有更好的方法,由于以下原因,此功能很慢:

  • 一个接一个地进行,当你可以简化为两个,因为除了两个之外的所有偶数都不是素数

  • 此外,它一直循环到最终的数字,当它永远不会有因素超过它的平方根

This是一个更好的函数示例,用于检查数字是否为素数。

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