求100以内的所有质数
i=2
while i<=100 :
flag = True
j=2
while j<i:
if i%j==0:
flag=False
j+=1
if flag :
print(i)
i+=1
这是我们之前写过的一个质数练习的代码,执行结果显然是没有问题的。但是只追求结果是没有什么意义的,就比如,打印100以内的质数,为什么我们要使用循环,而不是用第一次判断质数的代码,一个一个输入进行判断呢?那同学们考虑一下,这个循环就是程序的最优性能的一个质数判断代码了吗?跟着老师往下看。
要提升性能,首先就要知道当前程序的性能如何,可以通过引入Python的模块来判断,该模块可以输出程序运行时长,我们就以此数据为依托来进行性能的提升。
解释一下模块的概念,通过模块可以对Python进行扩展。
为了获得程序执行的时长,引入一个time的模块,time函数可以用来获取当前的时间,通过获取程序的开始时间和结束时间的二者之差来统计该时长。为了使得样本更加具有代表性,将数据改为2~10000。代码如下:
from time import*
#获得程序运行的开始时间
begin=time()
i=2
while i<=10000:
flag = True
j=2
while j<i:
if i % j == 0 :
flag = False
j += 1
if flag :
pass
#打印语句用时太久,将其删掉,为不影响程序的运行,直接pass就好。
# print(i)
i+=1
#获取程序运行的结束时间
end=time()
#获得程序运行时长
print("程序运行的时长为:",end-begin,"秒")
执行结果为:
可以看到,程序运行的时长为:8.815秒。
同学们来思考一下,咱们当前的判断质数的代码逻辑:举个例子,当要确定10000是否是质数的时候,计算机需要将10000与2~9999都进行一个除法运算,但是其实程序在将10000与2做除法的时候就可以判断该数字不是质数,没必要再进行继续判断,那该如何实现这一逻辑呢。
结合我们上节课讲的,一旦程序判断10000可以整除2,就没必要继续判断了,也就是说内层循环可以结束了。所以,我们可以用break来完成这一功能。
但是将break放在什么位置呢?
当程序进入判断if i%j==0 flag=False
,此时对于i来说只要看到flag的值为false,就没必要继续了,所以break 可以添加在flag变为false的后面,即如下:
from time import*
begin=time()
i=2
while i<=10000:
flag = True
j=2
while j<i:
if i % j == 0 :
flag = False
break
j += 1
if flag :
pass
i+=1
end=time()
print("程序运行的时长为:",end-begin,"秒")
执行结果为:
可以看到,此时只需要0.916秒程序就可以执行完毕。
但是这个就是最优的代码了吗?前人从来没有停止过思考,你也可以去想下,是否还可以有更加优质的算法,具体的教学老师在下节课再讲授。提示:还是可以从内层循环着手。
第二十一节:一行代码都不加如何提升性能