【发布时间】:2016-01-22 17:20:45
【问题描述】:
最近对简单的素性测试感兴趣。我有以下两个函数,它们返回给定输入之前的所有素数列表。我制作的第一个,另一个基于维基百科的素性测试伪代码。然后,我将我的稍微修改为我认为最接近维基百科的。
当我为它们计时(输入/限制为 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
【问题讨论】:
-
在
my_primality中的一个小优化是使用for count in range(5,lim,2)或xrange如果您在python 2 中,这样您就可以避免不断检查count<lim并免费获得count+=2 -
哦,谢谢。这是非常正确的。
标签: python time any primality-test