文档章节

Python 的效率編程_simplified

Renderbus
 Renderbus
发布于 2016/04/05 16:37
字数 1376
阅读 12
收藏 0
ryxjt
11 Python --- 说是当今最热门的编程语言之一,相信大家都不会反对。在去年就有报导说在美国顶针的计算机大学当中,有80%的大学已选用Python 作为编程入门的教学语言。在三维动画业界当中,也越来越多软件支援使用Python 来作开发,使制作人员能容易开发出相关工具,从而提升工作效能。 跟Perl 和Ruby 一样,Python 被归类为Scripting language,设计取向为语法简单,但秏用系统资源比较多,被形容为「犠牲执行效率去换取编程的开发时间」。在这里让我们来分享一些有关怎么去做Python 编程的例子,可以让我们争取更多的执行效率。 例子一・ 交换两个变数的值: import timeit def doSwapWVar(): a = 1 b = 2 tmp = a a = b b = tmp def doSwapWOVar(): a = 1 b = 2 a,b = b,a if __name__ == '__main__': t1 = timeit.Timer('doSwapWVar()', 'from __main__ import doSwapWVar') t1.timeit() #---------------------------------------- t2 = timeit.Timer('doSwapWOVar()', 'from __main__ import doSwapWOVar') t2.timeit() #The execute time print 'Swap with create variable : ', min(t1.repeat(3, 3000000)) print 'Swap without create variable : ', min(t2.repeat(3, 3000000)) print 'Swap with create variable : ', min(t1.repeat(3, 3000000)) print 'Swap without create variable : ', min(t2.repeat(3, 3000000)) print 'Swap with create variable : ', min(t1.repeat(3, 3000000)) print 'Swap without create variable : ', min(t2.repeat(3, 3000000)) Result : Swap with create variable : 0.577996969223 Swap without create variable : 0.568822145462 Swap with create variable : 0.588035106659 Swap without create variable : 0.556537151337 Swap with create variable : 0.599809169769 Swap without create variable : 0.563858985901 a,b = b,a 是Python 的一个典殿堂范例,完美展现出Python 语法的简单和优雅,但好处不只这样。我们使用timeit 来统计这两个不同的交换方法执行所需的时间,doSwapWVar是产生一个参数来暂存其中一个变数的值,另一个doSwapWOVar是直接运用Tuple的打包/解包来实现互换。 我们从结果看到,doSwapWOVar 执行的效率明显比doSwapWVar 快。 例子二・使用if 还是使用 try/except: 我们先来看下面的程式码 import timeit def doCheckUsingIf(x): d = {1:None, 2:None, 3:None, 4:None, 5:None, 6:None, 7:None, 8:None} for i in range(1, x): if i in d: d[i] = i def doCheckUsingTry(x): d = {1:None, 2:None, 3:None, 4:None, 5:None, 6:None, 7:None, 8:None} for i in range(1, x): try: d[i] = i except: pass if __name__ == '__main__': t1 = timeit.Timer('doCheckUsingIf(10)', 'from __main__ import doCheckUsingIf') t1.timeit() t2 = timeit.Timer('doCheckUsingTry(10)', 'from __main__ import doCheckUsingTry') t2.timeit() print 'Check using if :', t1.repeat(1) print 'Check using try :', t2.repeat(1) Result : Check using if : [2.5136549472808838] Check using try : [2.1905322074890137] 这次我们想要对一个dictionary 里面的key,指定一个跟key 一样的值。在Python 当中,如果指定值的Key 是不存在的话,系统就会返回错误。在doCheckUsingIf 当中,每次执行「d[i] = i」之前,都会用if 去先检查目标的key 是否存在于dictionary 里面。而doCheckUsingTry 当中,使用了try/except 去处理当「d[i] = i」错误发生的状况。从上面的结果看到的,使用Try/except 比使用if 所花的时间少。 我们来修改一下刚刚的程式码 import timeit def doCheckUsingIf(x): d = {1:None, 2:None, 3:None } for i in range(1, x): if i in d: d[i] = i def doCheckUsingTry(x): d = {1:None, 2:None, 3:None } for i in range(1, x): try: d[i] = i except: pass if __name__ == '__main__': t1 = timeit.Timer('doCheckUsingIf(10)', 'from __main__ import doCheckUsingIf') t1.timeit() t2 = timeit.Timer('doCheckUsingTry(10)', 'from __main__ import doCheckUsingTry') t2.timeit() print 'Check using if :', t1.repeat(1) print 'Check using try :', t2.repeat(1) Result : Check using if : [1.8367161750793457] Check using try : [2.2109630107879639] 我们只修改了d 在初始化时的内容,减少了一部份的key。有趣的是,这次的结果跟刚刚完全相反,运行doCheckUsingIf 比doCheckUsingTry 快!确实是当进入except 的次数比较多的状况下,执行所花的时间会非常多,但这是否代表我们就不应使用Try/except 呢?其实我们在编写程式的时候,不应该容许返回错误那么多的情况出现,只要我们在编程时注意所处理资料的向性,使用Try/except 也绝对可以是高效的。 例子三· 比对两个List import timeit def doCompareWithList(): a = range(30) b = range(10) for number in a: if number not in b: b.append(number) def doCompareWithDict(): a = range(30) b = range(10) dictB = dict.fromkeys(b) for number in a: if number not in dictB: a.append(number) dictB[number] = None b.append(number) if __name__ == '__main__': t1 = timeit.Timer('doCompareWithList()', 'from __main__ import doCompareWithList') t1.timeit() t2 = timeit.Timer('doCompareWithDict()', 'from __main__ import doCompareWithDict') t2.timeit() print 'Compare between with list :', t1.repeat(1) print 'Compare between with dict :', t2.repeat(1) Result: Compare between with list : [21.412750959396362] Compare between with dict : [12.298678874969482] 现在我们想要做的是比对一下a 跟b 两个List 里面的元素,当发现a 当中有b 没有的元素时,就把这个元素加入b 里面。在doCompareWithList 当中,用for 把a 的每一个元素代入成number,用if number not in b 去检查,我们要注意的是,这样要遍历整个b 才会知道number 是不存在的。所以当a 有大量b 没有的元素的话,遍历整个b 的次数会非常非常多。 在doCompareWithDict 当中,我们在比对之前先用b 的元素创建了dictB 这个dictionary,然后用if number not in dictB 来比对,检查number 是否跟一个dictionary 的key 相同,所执行的速度是非常快,key数量的多少不会对这速度有太大的影响,所以我们看到范例的做法,doCompareWithDict 比doCompareWithList 效率超出了43%。 以上就是本期瑞云学堂的内容,希望对CG感兴趣的朋友可以关注我们的微信公众平台,或者官方微博,下期瑞云小讲堂再见!

本文转载自:http://www.rayvision.com/blog/?p=541

共有 人打赏支持
Renderbus
粉丝 0
博文 107
码字总数 6108
作品 0
深圳
私信 提问
我什麼時候可以學習其他編程語言?

大家好我學習Python大約有1年的,我可以學習其他的語言嗎?可能是Java或C \ C + +。因為Python在香港的就業機會似乎不大。 但我真的很喜歡在python python和我還是新手,所以我不知道應不應該...

jacklam
2013/07/25
552
15
CERT_NONE is not defined

緣起 突然想學習下[requests][1],不過在安裝[requests][1] 時卻報了這個錯誤:“NameError: name 'CERT_NONE' is not defined”。 在[Googole][2]上搜索之後才知道,[requests] [1]需要 ss......

星塵子
2013/03/09
0
0
工程師的缺德行為:叫朋友去學C/C++

yo~小弟出社會工作一兩年了,有一些心得想分享給想入門學程式的朋友 小弟的網誌有安裝繁體、簡體中文轉換的plugin,可以在上面逛! http://blog.turn.tw/?p=1283 --------------------------...

尤川豪
2015/02/08
8.1K
41
python 的 开发利器之 Virtualenv 与 Pythonbrew

Virtualenv 和 Pythonbrew 都是可以創造虛擬(獨立)Python 環境的工具,只是虛擬(獨立)標的不同。 Virtualenv 可以隔離函數庫需求不同的專案,讓它們不會互相影響。在建立並啟動虛擬環境後...

首席安全砖家
2013/10/27
0
0
【开源访谈】Python China 创始人 Hsiaoming Yang 访谈实录

【嘉宾简介】 Hsiaoming Yang,Python china创始人,GitHub 上最活跃的国内开发者之一,常用 ID:lepture。 【正文】 1、请简单地介绍一下你自己(技术背景、学习经历、工作经历)。 我叫 Hs...

孔小菜
2015/06/01
5.4K
16

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部