为什么这些素数生成器中的一个比另一个快?
Why is one of these prime number generators faster than the other?
最近对简单的素性测试很感兴趣。我有以下两个函数 return 到给定输入的所有素数的列表。第一个是我做的,另一个是基于维基百科的素数测试伪代码。然后我稍微修改了我的内容,使其成为我认为最接近维基百科的内容。
当我为它们计时时(input/limit 为 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
将遍历整个列表以查看是否有任何元素被评估为真。 while
循环中断得更快,因为它考虑到元素是按递增顺序排列的。您可以使用 itertools
中的 takewhile
,您应该得到与 while 循环类似的 运行 时间。
最近对简单的素性测试很感兴趣。我有以下两个函数 return 到给定输入的所有素数的列表。第一个是我做的,另一个是基于维基百科的素数测试伪代码。然后我稍微修改了我的内容,使其成为我认为最接近维基百科的内容。
当我为它们计时时(input/limit 为 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
将遍历整个列表以查看是否有任何元素被评估为真。 while
循环中断得更快,因为它考虑到元素是按递增顺序排列的。您可以使用 itertools
中的 takewhile
,您应该得到与 while 循环类似的 运行 时间。