- 13
- Mar
这几天在看Python的作者写的Tutorial,受益非浅,又学到了很多Python特色的知识。现在还知道怎么样来优化Python的代码了。
举一最简单的例子:你是如何交换两个数的值的呢?
-----
在其他语言中,我们应该是这样交换两个数的大小的。
t=a; a=b; b=t
在Python中,我们还有一个简单的办法,a,b = b,a。当然,在Python中前一种方法也是适用的。那么,这两种方法仅仅是句式的不同吗?哪种快呢?
用Python的模块timeit就可以知道答案了,timeit模块可以计算完成一个表达式需要的时间:
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.11412903036559108
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.063075055628580401
哇,在我这台测试的机器上(Pentium D 3.0GHz),两种句式的速度差异居然有近100%。当然,仅供参考。
这个问题说明了什么呢?在Python中,能用Python优雅的语法直接完成的,尽量直接完成,而不要定义中间变量。而且当你觉得你的代码中有一种以上的方法时,你可以用timeit模块来测试哪种方式更快,从而对代码进行了优化。
嗯,Python真是太方便了。无论是编码还是测试还是优化。继续深入学习!
看来Pentium的CPU就是比俺的Celeron强……
>>> Timer('t=a;a=b;b=t','a=1;b=2').timeit()
0.26301471276377697
>>> Timer('a,b=b,a','a=1;b=2').timeit()
0.20927436308247138
呵呵,整整快一倍啊。我测试的是机房的电脑,看来主频高还是有优势的,我的Core 2 Duo还不如Pentium D。
我的运行不了
File "", line 1
Timer(’a,b=b,a’,'a=1;b=2').timeit()
^
SyntaxError: invalid syntax
看看怎么回事
是单引号的问题,WP把单引号转换了,请你手动把单引号重新打一遍吧。呵呵。
呵呵,好了!谢谢你
C语言交换两数,不通过中间变量
a^=b^=a^=b
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.43414783477783203
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.39924883842468262
我晕,俺的速龙3000+怎么这么慢啊!
不知是不是和自动降频有关,当CPU空闲时主频会自动降为1G.
是用的 python 3 吗,好像性能有质的飞跃哦
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.37353741886189445
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.29559483118664787
>>>
我的PIII 1G的机子
优点在于代码的简洁性:更短的代码,不引入中间变量,不容易打错,等等;而不在于性能的这么点提升。
差20%, python2.6, 2.53GHz cpu
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.18867087364196777
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.15594005584716797
python 2.5.1 core2, T8100, 2.1GHz
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.093669587898980902
>>> Timer('a,b=b,a','a=1;b=2').timeit()
0.054360046771002146
>>>
0.0602217541342
0.037714815818
core2 l2 6m~macbook pro,just for fun