• 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真是太方便了。无论是编码还是测试还是优化。继续深入学习!

Tags: Python.

» You can leave a comment.

13 Comments

  1. 看来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

  2. 呵呵,整整快一倍啊。我测试的是机房的电脑,看来主频高还是有优势的,我的Core 2 Duo还不如Pentium D。

  3. zhoubin

    我的运行不了
    File "", line 1
    Timer(’a,b=b,a’,'a=1;b=2').timeit()
    ^
    SyntaxError: invalid syntax
    看看怎么回事

  4. 是单引号的问题,WP把单引号转换了,请你手动把单引号重新打一遍吧。呵呵。

  5. zhoubin

    呵呵,好了!谢谢你

  6. C语言交换两数,不通过中间变量
    a^=b^=a^=b

  7. >>> 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.

  8. wyg1258

    是用的 python 3 吗,好像性能有质的飞跃哦

  9. llqbll

    >>> 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的机子

  10. iambic

    优点在于代码的简洁性:更短的代码,不引入中间变量,不容易打错,等等;而不在于性能的这么点提升。

  11. someone

    差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

  12. cino

    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
    >>>

  13. de

    0.0602217541342
    0.037714815818

    core2 l2 6m~macbook pro,just for fun

Leave a Comment