打印1-200000以内素数,我测试了两段代码。 第一种采用函数调用的方式花了1.87s,第二种把函数体写到循环体里面执行,反而花了2.25s。这是为什么呢?
(1)
def isPrime(n):
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
i = 3
while i * i <= n:
if n % i == 0:
return False
i += 2
return True
for n in range(1, 200000):
if isPrime(n):
print n
(2)
for n in range(1, 200000):
if n <= 1:
continue
if n == 2:
print n
continue
if n % 2 == 0:
continue
i = 3
flag = True
while i * i <= n:
if n % i == 0:
flag = False
break
i += 2
if flag:
print n
因为第二种算法是错的,多打印出了许多东西。
break
之后合数还是被打印出来了。PS: 利用 Python 3.2+ 的
functools.lru_cache
,可以轻松实现更好的算法。来,修正后的第二种算法为什么还是比较慢:
第三种算法如下:
查找全局变量比查找局部变量慢。