Python素数生成器收益率与回报率
搜索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
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