如何用一行代码让运行速度提高近10倍 | Python从入门到精通:入门篇之二十

第十九节:循环终止之break和continue的用法

求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,"秒")

执行结果为:
如何用一行代码让运行速度提高近10倍 | Python从入门到精通:入门篇之二十
可以看到,程序运行的时长为: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,"秒")

执行结果为:
如何用一行代码让运行速度提高近10倍 | Python从入门到精通:入门篇之二十
可以看到,此时只需要0.916秒程序就可以执行完毕。
但是这个就是最优的代码了吗?前人从来没有停止过思考,你也可以去想下,是否还可以有更加优质的算法,具体的教学老师在下节课再讲授。提示:还是可以从内层循环着手。
第二十一节:一行代码都不加如何提升性能

视频学习:阿里云大学之Python进阶必看

配套Python进阶文章点击此处获取

上一篇:Asp.Net 上传大文件专题(1)--概述:上传大文件的难点


下一篇:Python 为什么不支持 switch 语句?