为什么你的代码执行起来耗时较长?

点击上方 蓝色文字,选择置顶或星标

第一时间关注 Python 技术干货!

阅读文本大概需要 6 分钟。

春节过后,大家都陆续返回工作地上班了吧,我今天第一天上班,在地铁上用手机总结分享时忘了时间,坐过了一站,地铁上人也挺多,大家又逐渐回归到上海的快节奏生活中。

不管是公司的产品还是自己的项目,如果要做强做大,必须要关注性能问题,你的代码性能差,在大神眼里,就是不规范的代码了。

为什么你的代码执行起来耗时较长?_第1张图片

(图片来源:微信朋友圈)

你平时有关注你的代码的性能问题吗?今天通过几个简单的小栗子,给大家来讲讲性能耗时那些事儿。

打印1000以内数的列表

打印1000以内的数并组成一个 list 列表,这道题不难吧?你能用四种方法解答此题吗?借此机会正好复习下你的基础,先不要看答案,自己先想想,然后再点击空白处就可以查看答案。

01

方法1:for 循环 & 连接符

点击空白处显示答案

为什么你的代码执行起来耗时较长?_第2张图片

02

方法2:for 循环 & append 添加

点击空白处显示答案

为什么你的代码执行起来耗时较长?_第3张图片

03

方法3:列表表达式

点击空白处显示答案

为什么你的代码执行起来耗时较长?_第4张图片

04

方法4:Python 内置函数

点击空白处显示答案

为什么你的代码执行起来耗时较长?_第5张图片

都答出来了吧?没全部想到的同学得要好好复习下基础了。

哪个性能最优?

以上四种方法哪种代码的性能最优呢?先想想,心中有自己的答案后再点击下方空白查看,看看正确答案是不是你心中所想。

00

哪种方法性能最优?

点击空白处显示答案

方法4:Python 内置函数

为什么是这种方式性能最优呢?我们分别计算出代码的运行时间就会一目了然了。

计算代码执行时间,我们可以用 timeit 模块里的方法。timeit 模块可以用来测试一小段 Python 代码的执行速度。

timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。

一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次,方法返回执行代码的耗时,返回的是 float 类型的秒数。

所以它的用法格式如下:

timer1 = Timer("t1()""from __main__ import t1")
print("concat ",timer1.timeit(number=10000), "seconds")

这里为了比较时间,我把执行次数扩大 10000 倍。

把上面函数代码加上一下代码同时执行。

timer1 = Timer("t1()""from __main__ import t1")
print("concat ", timer1.timeit(number=10000), "seconds")
timer2 = Timer("t2()""from __main__ import t2")
print("append ",timer2.timeit(number=10000), "seconds")
timer3 = Timer("t3()""from __main__ import t3")
print("comprehension ", timer3.timeit(number=10000), "seconds")
timer4 = Timer("t4()""from __main__ import t4")
print("list range ", timer4.timeit(number=10000), "seconds")

执行结果如下:

concat  18.075767521498722 seconds
append  1.0233209442258122 seconds
comprehension  0.42848983041544386 seconds
list range  0.1732263190517216 seconds

结果出来了吧,最快的是用内置函数 list range 方法,执行 10000 次后耗时 0.17 秒,亚军是列表表达式,0.42 秒,耗时最长是用加号连接符,耗时 18 秒。

所以,结论是:调用 Python 内置函数执行速度是最快的,内置函数的性能是最优的。所以当你的模块被大量调用,尽量用内置函数搞定。

平时大家爬虫时往列表里添加数据也是用得比较多的吧,往列表里添加数据用的多是 append() 和 insert(),这个两个方法有区别吗?有。直接看执行效果。

def t5():
    li = []
    for i in range(10):
        li.append(i)
    print(li)


def t6():
    li = []
    for i in range(10):
        li.insert(0, i)
    print(li)


t5()
t6()

运行结果如下:

[0123456789]
[9876543210]

所以,append() 方法是从尾端添加元素,而 insert() 方法是从顶端添加元素的。

他们的区别不仅于此,性能上有区别吗?我们用上面的方法看看便知。

为了看清楚效果,我们把 range 内的次数改成 10000。

def t5():
    li = []
    for i in range(10000):
        li.append(i)


def t6():
    li = []
    for i in range(10000):
        li.insert(0, i)


timer5 = Timer('t5()''from __main__ import t5')
print("append:", timer5.timeit(number=1000))

timer6 = Timer('t6()''from __main__ import t6')
print("insert:", timer6.timeit(number=1000))

看看执行耗时:

append: 1.1306300416743456
insert: 31.27993700877352

差距太明显,直接 KO,所以 append 从尾端添加元素的效率远远高于 insert 从顶端添加元素的效率。

希望通过今天的小栗子,大家能明白性能的重要性,当然,这只是性能优化的冰山一角,以后我们慢慢再聊。

觉得对你有帮助的大家 帮忙点点好看,戳下鸡腿也可以转发给更多的伙伴。

欢迎点击下方小程序留言讨论。

 更多阅读 

年后开工,用Python分析深圳程序员工资有多高?

用Python勾勒世界地图和中国地图

爷爷:啥是佩奇?佩奇:Python 10 秒可以画出来

Python抢票程序优化,可以选择车次和座次

以梦为马,不负韶华

长按识别二维码关注为什么你的代码执行起来耗时较长?_第6张图片

你可能感兴趣的:(为什么你的代码执行起来耗时较长?)