打印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
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
因为第二种算法是错的,多打印出了许多东西。
break
之后合数还是被打印出来了。PS: 利用 Python 3.2+ 的
functools.lru_cache
,可以轻松实现更好的算法。来,修正后的第二种算法为什么还是比较慢:
第三种算法如下:
查找全局变量比查找局部变量慢。
我在这里凑个热闹,python 写的打印素数,没别的,只是速度很快。
3.py 是上面@依云 写的 4.py 是我的:
算法是逆向思考,从3开始,3的倍数肯定都不是素数,全部排除,5也同理。。最后输出剩下的就好了。
严格的说 M 应该是
int(math.sqrt(N)) + 1
吧找素数最少判断个数应该采用的策略是,6N+1和6N-1应该比单独判断奇数要少1/3时间。