【问题标题】:Python prime numbers generator yield vs return [duplicate]Python素数生成器产量与回报[重复]
【发布时间】:2013-06-28 00:08:02
【问题描述】:

搜索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)

还有:

def get_primes(number):
    while True:
        if is_prime(number): #is_prime is defined somewhere else
            yield number
        number += 1

什么更有效,返回列表还是 yield 命令?为什么?考虑一下我正在寻找大量的素数,比如前 1000 个素数。对了,第二段代码好像是死循环了,怎么停止呢?

感谢和抱歉这么多问题。

【问题讨论】:

  • 这两种方法完全没有可比性;一个循环遍历所有可能的数字并测试每个数字,另一个通过实现筛子更有效地处理它。您在这里比较苹果和梨。

标签: python return primes yield


【解决方案1】:

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

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

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

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

简单的解释是你的第一个函数返回一个最多为 n 的素数列表。获得该列表后,您可以在需要时访问其中的任何成员,调用整个列表上的函数等。第二种方法是生成器。它不会返回一个列表——它会返回一个迭代器,它会根据需要提供下一个素数。因此,如果您一次需要一个素数,为了可能对每个素数调用一个函数,迭代器可能会很好。但是,如果您需要按需访问素数,则不会这样做。

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

例如:

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 的问题,我会继续猜测筛子会更好地工作。

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 2014-01-06
    • 2019-05-14
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2019-02-19
    相关资源
    最近更新 更多