我有一个函数,它列出了小于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倍,因为它与第一个版本完全相同,只是变量必须遍历一个较短的列表。你知道吗
我正试图找到一种比N小的素数列出来的更快的方法
ListPrimesFaster()
不会搜索较短的列表,因为它包含list
中高于sqrt(n)
的元素。list
的大小比sqrt(n)
增长得更快,从3开始的范围也节省了一些步骤。ListPrimes(100)
执行139
n % i == 0
测试,而ListPrimesFaster(100)
执行362
。当N
是500
时,测试计数是1616
对4933
。你知道吗顺便说一句,在
ListPrimes()
中,内部循环只需要测试奇数因子,因为n
总是奇数,所以您可以将其更改为:这个简单的更改将
N = 100
的测试数减少到87
,将N = 500
的测试数减少到907
。你知道吗相关问题 更多 >
编程相关推荐