作家
登录

Python性能优化

作者: 来源: 2017-08-08 10:47:41 阅读 我要评论

    return time.time() - begin 
  •  
  •   
  •  
  • if __name__ == '__main__'
  •  
  •     print 'Slots cost', log_time(Slots()) 
  •  
  •     print 'NoSlots cost', log_time(NoSlots())  
  • 输出结不雅:

    1. Slots cost 3.12999987602 
    2.  
    3. NoSlots cost 3.48100018501  

    python C扩大

    也许经由过程profile,我们已经找到了机能热点,但这个热点就是要运行大年夜量的计算,并且没法cache,没法省略。。。这个时刻就该python的C扩大出马了,C扩大就是把部分python代码用C或者C++从新实现,然后编译成动态链接库,供给接口给其它python代码调用。因为C说话的效力远远高于python代码,所以应用C扩大是异常广泛的做法,比如我们前面提到的cProfile就是基于_lsprof.so的一层封装。python的赶紧属对机能有请求的库都应用或者供给了C扩大,如gevent、protobuff、bson。

    笔者曾经测试过纯python版本的bson和cbson的效力,在综合的情况下,cbson快了差不多10倍!

    python的C扩崭荷饲一个异常复杂的问题,本文仅给出一些留意事项:

    第一:留意引用计数的┞俘确治理

    这是最难最复杂的一点。我们都知道python基于指针技巧来治理对象的生命周期,如不雅在扩大中引用计数出了问题,那么要么是法度榜样崩溃,要么是内存泄漏。更要命的是,引用计数导致的问题很难debug。。。

    C扩大中关于引用计数最关键的三个词是:steal reference,borrowed reference,new reference。建议编写扩大代码之前细读python的官方文档。

    第二:C扩大与多线程

    这里的多线程是指在扩大中new出来的C说话线程,而不是python的多线程,出了python doc琅绫擎的介绍,也可以看看《python cookbook》的相干章节。

    第三:C扩大应用处景

    仅合适与营业代码的关系不那么慎密的逻辑,如不雅一段代码大年夜量营业相干的对象 属性的话,是很难C扩大的

    将C扩大封装成python代码可调用的接口的过程称之为binding,Cpython本身就供给了一套原生的API,固然应用最为广泛,但该规范比较复杂。很多第三方库做了不合程度的封装,以便开辟者应用,比如boost.python、cython、ctypes、cffi(同时支撑pypy cpython),具体怎么应用可以google。

    beyond CPython

    尽管python的机能差能人意,然则其易学易用的特点照样博得越来越多的应用者,业界大年夜牛也大年夜来没有放弃对python的优化。这里的优化是对python说话设计上、或者实现上的一些反思或者加强。这些优化项目一些已经夭折,一些还在进一步改良中,在这个章节介绍今朝还不错的一些项目。

    cython

    前面提到cython可以用到binding c扩大,然则其感化远远不止这一点。

    固然Cprofile的输出已经比较直不雅,但我们照样偏向于保存profile的结不雅,然后用图形化的对象来大年夜不呵9依υ?度来分析,或者比较优化前后的代码。查看profile结不雅的对象也比较多,比如,visualpytune、qcachegrind、runsnakerun,本文用visualpytune做分析。对于膳绫擎的代码,按照注释生成修改后从新运行生成test.prof文件,用visualpytune直接打开就可以了,如下:

    Cython的重要目标是加快python的运行效力,然则又不像上一章节提到的C扩大那么复杂。在Cython中,写C扩大和写python代码的复杂度差不多(多亏了Pyrex)。Cython是python说话的超集,增长了对C说话函数调用和类型声明的支撑。大年夜这个角度来看,cython将动态的python代码转换成静态编译的C代码,这也是cython高效的原因。应用cython同C扩大一样,须要编译成动态链接库,在linux情况下既可以用敕令行,也可以用distutils。

    如不雅想要体系进修cython,建议大年夜cython document入手,文档写得很好。下面经由过程一个简单的示例来展示cython的应用办法和机能(linux情况)。

    起首,安装cython:

    1. pip install Cython 

    下面是测试用的python代码,可以看到这两个case都是运算复杂度比较高的例子:

    1. def f(): 
    2.  
    3.     return x**2-x 
    4.  
    5.   
    6.  
    7. def integrate_f(a, b, N): 
    8.  
    9.     s = 0 
    10.  
    11.     dx = (b-a)/N 
    12.  

        推荐阅读

        做大数据真的能赚钱吗?

      于IT业内,大年夜数据之火热程度,似乎无出其右者。当然,在颇┞锋正爆发前夕,也应当合时泼盆冷水。谁能接触到数据国内冠以大年夜数据之名的企业数以千计,但细分其专注范畴,大年夜致可>>>详细阅读


      本文标题:Python性能优化

      地址:http://www.17bianji.com/lsqh/36589.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)