python素数生成器_如何在Python中实现有效的素数无限生成器?

因为OP要求高效率实现,这是对活动状态2002码作者:David Eppstein/Alex Martelli(见他的回答): 不要在词典中记录质数的信息,直到候选人看到它的正方形。..将空间复杂性降低到下面O(平方吨(N)而不是O(N),对于产生的n个素数(π(sqrt(N Log N) ~ 2平方米(n对数)/2平方吨(n对数) ~ 2平方米(n/log n))。因此,时间复杂度也得到了改善,即它跑得更快.

创建一个“滑动筛”作为每个基质数的当前倍数(即低于当前生产点的sqrt)的字典,以及它们的步进价值:from itertools import count # ideone.com/aVndFMdef postponed_sieve():

# postponed sieve, by Will Ness

yield 2; yield 3; yield 5; yield 7; # original code David Eppstein,

sieve = {} # Alex Martelli, ActiveState Recipe 2002

ps = postponed_sieve() # a separate base Primes Supply:

p = next(ps) and next(ps) # (3) a Prime to add to dict

q = p*p # (9) its sQuare

for c in count(9,2): # the Candidate

if c in sieve: # c's a multiple of some base prime

s = sieve.pop(c) # i.e. a composite ; or

elif c < q:

yield c # a prime

continue

else: # (c==q): # or the next base prime's square:

s=count(q+2*p,2*p) # (9+6, by 6 : 15,21,27,33,...)

p=next(ps) # (5)

q=p*p # (25)

for m in s: # the next multiple

if m not in sieve: # no duplicates

break

sieve[m] = s # original test entry: ideone.com/WFv4f

(此处较旧的原始代码是经过编辑以包含更改的,如答案通过蒂姆·彼得斯(见下文)。另见这,这个进行相关的讨论。

相似2-3-5-7轮-基于代码快2.15倍(这与理论上的改进非常接近。3/2 * 5/4 * 7/6 = 2.1875).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值