最近我读了一个非常简洁的方法来生成素数列表,用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吗?
我个人的想法是它的可读性和非常简化,我不确定它是否是一种很好的编码方式,而且我并不认为代码是有效的
答案 0 :(得分:3)
对于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))
这仍然比“传统”算法更糟糕,但比原来算法要好得多(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)
答案 3 :(得分:0)
有更好的方法,由于以下原因,此功能很慢:
一个接一个地进行,当你可以简化为两个,因为除了两个之外的所有偶数都不是素数
此外,它一直循环到最终的数字,当它永远不会有因素超过它的平方根
This是一个更好的函数示例,用于检查数字是否为素数。
如果你至少在寻找速度,那就是主要问题。