我有一个列出小于N的素数的函数:
def ListPrimes(N):
list = [2]
for n in range(3, N, 2):
for i in range(3, int(sqrt(n)+1)):
if n % i == 0:
break
else:
list.append(n)
return list
我试图让它更快,所以我将一行改为:
def ListPrimesFaster(N):
list = [2]
for n in range(3, N, 2):
for i in list:
if n % i == 0:
break
else:
list.append(n)
return list
我很惊讶第二个版本至少慢了5倍,因为它与第一个版本相同,只是变量i必须遍历较短的列表。
我试图找到一种更快的方法来列出小于某些N的素数。
答案 0 :(得分:1)
ListPrimesFaster()
不会搜索较短的列表,因为它包含list
中高于sqrt(n)
的元素。 list
的大小增长速度快于sqrt(n)
,并且从3开始范围也可以节省几个步骤。 ListPrimes(100)
执行139
n % i == 0
次测试,而ListPrimesFaster(100)
执行362
。当N
为500
时,测试计数为1616
与4933
。
BTW,在ListPrimes()
中,内部循环只需要测试奇数因子,因为n
总是奇数,所以你可以把它改成:
for i in range(3, int(sqrt(n)+1), 2):
这个简单的更改会将87
的{{1}}和N = 100
的{{1}}的测试次数减少。