你平时有关注自己写的代码的性能问题吗?

刚开始学习编程时,不管性能好不好,能得到需要的结果是第一步。但随着学习的深入,就必须要关注性能问题,你的代码性能差,在大神眼里就是“烂”代码了。

今天通过几个简单的小栗子,给大家来讲讲性能耗时那些事儿。

生成1000以内数的列表

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

01

方法1:for 循环 & 连接符

点击空白处显示答案

02

方法2:for 循环 & append 添加

点击空白处显示答案

03

方法3:列表生成式

点击空白处显示答案

04

方法4:Python 内置函数

点击空白处显示答案

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

哪个性能最优?

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

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 secondsappend  1.0233209442258122 secondscomprehension  0.42848983041544386 secondslist 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()

运行结果如下:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

所以,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.1306300416743456insert: 31.27993700877352

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

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

作者:pk哥

来源:Python知识圈


夸奖对方代码写的好_测一测,你写的代码性能好吗?相关推荐

  1. python识别手写数字字体_基于tensorflow框架对手写字体MNIST数据集的识别

    本文我们利用python语言,通过tensorflow框架对手写字体MNIST数据库进行识别. 学习每一门语言都有一个"Hello World"程序,而对数字手写体数据库MNIST ...

  2. python写邮箱系统_教大家用Python写一个简单电子邮件发信器

    嘛~炎热的暑假大家都在家干些啥呢?up主本人每天就是摸鱼哒!为了让这个懒懒的up每天从床上早点爬起来,我可是立了不少flag呢~那就先不多说了,直接开始正文吧. 声明一下,本文内容为原创,如果引用其他 ...

  3. 运维简历怎么写项目描述_职场小白怎么写简历?一份好简历=成功一半

    在求职的道路上,职场小白们摸索着一路过关斩将.简历就像是游戏中新手村出口的守关BOSS,只有通过它,菜鸟们才能够进入到更加广阔的世界.但是仔细回想一下,似乎在学校里,我们并没有接触到太多撰写简历的知识 ...

  4. java jxl 写 excel文件_使用jxl读和写Excel文件(速成)

    同行整理,简单明了,快速上手! =============================正文1============================ 最近和Excel频繁亲密接触,主要将N个Exc ...

  5. 用java写2468游戏_关于第一次用java写小游戏(贪吃蛇)的体会记录

    作为一只菜鸡,对于编程的世界还一无所知,但是感觉应该要写点实用的东西.突然发现好像贪吃蛇应该能写出来(那种几乎没有用户界面的),于是就开始了. 1.关于对简单的动画呈现的资料准备 因为只有一些捉襟见肘 ...

  6. python是用c 写的吗_我能用python写一个c语言出来吗?

    完全可以 正确的比喻: 空间->白纸; 0,1(计算机底层的二进制表示方案)->黑色笔迹; python -> 韩语相关语法规则; C -> 英语相关语法规则; 请问可以使用韩 ...

  7. vba代码编程800例_一组实用的VBA常用编程代码语句分享

    蓝字关注,加微信NZ9668获资料信息  VBA解决方案   系列丛书作者  头条百家平台 VBA资深创作者 _______________________________ 分享成果,随喜真能量.大家 ...

  8. 如何让代码更易于维护_易于使用的单位和集成代码

    如何让代码更易于维护 此示例说明如何使用Maven和Sonar为单元和集成测试生成覆盖率. 它使用非常简单的技术,只需10-15分钟即可在任何现有的Maven构建中运行. 它可以用于单元,集成,ATD ...

  9. python 零代码快速开发平台_企业如何选择开源的零代码开发平台

    原标题:企业如何选择开源的零代码开发平台 开源零代码开发平台是指开放源代码的零代码开发平台,因为其代码是开放的,所以企业如果有自己的技术人员可以直接进行功能及性能的修改.零代码开发平台经过多年的发展已 ...

  10. 离职通知邮件主题写什么好_离职祝福邮件怎么写

    离职的时候不妨给昔日的同事送上自己最后的祝福吧!道离别,离别就在眼前;说再见,再见不会是永远.芳草萋萋下,你将我送别,祝愿你今后的道路越走越宽,越走越顺,一路珍重!以下是小编精心收集整理的离职祝福邮件 ...

最新文章

  1. 《UNIX环境高级编程》--符号链接
  2. python在哪下载-2018版Python教程从哪儿下载
  3. php目录间拷贝文件方法
  4. javascript里的post和get有什么区别
  5. 集成方法Ensemble Method(bagging, AdaBoost)
  6. ajax回调给全局变量,jquery.Ajax回调成功后数据赋值给全局变量的问题
  7. 杭州之行--记杭电网新恩普杯程序设计邀请赛
  8. Arcgis API For Javascript下载与安装
  9. Java常用设计模式的实例学习系列-绪论
  10. win10安装mysql-8.0.12-winx64解压版
  11. 51单片机3-红外通信
  12. 树莓派/Ubuntu联网以及查看本机的IP
  13. 音频编码格式与术语汇总
  14. 趣味小问题2——规律型勾股数
  15. scikit-learn KNN实现糖尿病预测
  16. frps实现内网穿透
  17. 404 Note Found队 Alpha7
  18. 微型计算机的型号是奔四800,第1章 微型计算机基础知识
  19. 评论区抽奖程序2.0
  20. Spring @InitBinder注解

热门文章

  1. centos7安装xterm_CentOS 7使用x-manager中Xstart工具报缺少xterm包错误
  2. 猿辅导的python课_每天自学俩小时Python,改变命运足矣
  3. html获取url后面的参数_Golang Gin 实战(四)| URL查询参数的获取和原理分析
  4. 如何在Timeline中使用Cinemachine?
  5. 容器安全 - 非特权/非root用户运行容器,提升容器的运行安全
  6. OpenShift 4 Tekton (2) - OpenShift Pipeline入门-用Pipeline部署应用
  7. 使用face-api和Tensorflow.js在浏览器中进行AI年龄估计
  8. 如何使用Elasticsearch在.NET应用程序中实现全文搜索
  9. 斯坦福大学发布 2019 人工智能指数报告
  10. java和oc_Java和OC中的数据容器和数组