Python素数生成器收益率与回报率

Python素数生成器收益率与回报率,python,return,primes,yield,Python,Return,Primes,Yield,搜索python素数生成器时,我发现: def primes(n): if n==2: return [2] elif n<2: return [] s=range(3,n+1,2) mroot = n ** 0.5 half=(n+1)/2-1 i=0 m=3 while m <= mroot: if s[i]: j=(m*m-3)/2 s[j]=0

搜索python素数生成器时,我发现:

def primes(n): 
    if n==2: return [2]
    elif n<2: return []
    s=range(3,n+1,2)
    mroot = n ** 0.5
    half=(n+1)/2-1
    i=0
    m=3
    while m <= mroot:
        if s[i]:
            j=(m*m-3)/2
            s[j]=0
            while j<half:
                s[j]=0
                j+=m
        i=i+1
        m=2*i+3
    return [2]+[x for x in s if x]

print primes(13)
print primes(3000)
返回列表或yield命令更有效吗?为什么?考虑一下,我正在寻找大量的素数,比如前1000个素数。顺便说一下,第二个代码似乎是一个无限循环,如何阻止它


感谢并抱歉提出这么多问题。

这取决于你想对素数列表做什么

首先,正如Martijn指出的,第一个算法是一个非常聪明的素数筛,第二个算法测试每个素数。如果您对快速素数算法感兴趣,我会查找一些不同的素数筛,以更好地理解该方法。最简单的是埃拉托斯烯筛

无论如何,我不认为这是你的问题。您实际上是在寻找普通Python函数和生成器之间的区别。关于这一点,有很多问题和大量的文档可以很好地解释生成器是什么

当我看到你的问题时出现在侧边栏中,我想这会很有帮助。或者只是在文档中搜索“生成器”

最简单的解释是,第一个函数返回的素数列表最多为n。一旦你有了这个列表,你可以在需要的时候访问它的任何成员,调用整个列表中的函数,等等。第二种方法是生成器。它不返回列表——它返回一个迭代器,根据需要生成下一个素数。因此,如果您需要一次调用一个素数,或者对每个素数调用一个函数,那么迭代器可能会很好。但是,如果您需要按需访问primes,这将不起作用

如果您正在寻找满足某些条件的第一个素数,那么生成器是好的,因为您不必指定范围。如果只需要前100个素数,就没有理由生成前1000个素数

例如:

for prime in get_primes(2):
    if meets_condition(prime):
        return prime
将优于:

primeList = primes(1000)
for prime in primeList:
    if meets_condition(prime):
        return prime
如果n很小,但如果n接近1000,则不是

我得走了,对不起。稍后我将展开并校对这篇文章。查找发电机和主筛


如果您正在处理projecteuler.com的问题,我将继续并猜测筛子将更好地工作。

这两种方法根本不可比较;一个循环遍历所有可能的数字并测试每个数字,另一个则通过实现一个筛子来更有效地进行测试。你在这里比较苹果和梨。
primeList = primes(1000)
for prime in primeList:
    if meets_condition(prime):
        return prime