最近我读到一个用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))
pros
和cons
是什么?它是Pythonic的吗?
我个人的想法是它的可读性和非常简化,我不确定如果这是一个很好的方式来编码,我不肯定的代码是有效的
对于prime = 10000
,该代码执行78021次除法,而传统方法不超过2302次。
您的方法可以通过只检查奇数并在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以外的所有偶数都不是素数
-
同时,它一直循环到最后的数字,当它永远不会有超过平方根的因子
这是一个更好的函数来检查一个数字是否是素数的例子。
如果你至少在寻找速度,这些是主要问题。