最近对简单的素性测试感兴趣。我有以下两个函数,它们返回到给定输入的所有素数的列表。第一个是我做的,另一个是基于维基百科的素性测试伪代码。然后我稍微修改了一下,使之成为我认为最接近维基百科的
当我对它们计时(输入/限制为10000)时,我的要比另一个长一个数量级。我不太清楚为什么,对我来说,他们在做非常相似的事情。我用“any”检查素数列表,而wiki用while循环生成素数列表。我错过了什么?你知道吗
def my_primality(lim):
count = 5
slbprimes = [2,3];
while count<lim:
if count%3==0:
pass
elif any(count%i==0 for i in slbprimes if i**2<=count):
pass
else:
slbprimes.append(count)
count+=2
return slbprimes
def evenbetter(lim):
count = 5
ebprimes=[2,3];
while count < lim:
if count%3==0:
count+=2
continue
i=5
while i**2<=count:
if count%i==0 or count%(i+2)==0:
count+=2
break
i=i+6
else:
ebprimes.append(count)
count+=2
return ebprimes
any
将遍历整个列表,以查看是否有任何元素的计算结果为true。while
循环中断得更快,因为它考虑到元素的顺序是递增的。您可以从itertools
玩takewhile
,您应该得到与while循环类似的运行时间。你知道吗相关问题 更多 >
编程相关推荐