前言

无论使用哪种语言,我们都需要关注性能优化,提高执行效率。选择脚本语言需要持久的速度。在某种程度上,这句话说明了Python作为一种脚本语言的缺点,即执行效率和性能不够好。虽然Python从来没有像C和Java那样快,但是许多Python项目位于开发语言的最前沿。

Python很容易使用,但大多数使用它的人都知道,在处理密集型CPU时,它的大小仍然低于C、Java和JavaScript。但是许多第三方不愿意细想Python的优势,决定从内到外改进它的性能。如果希望Python在同一硬件上运行得更快,则有两个基本选择,每个选择都有一个缺点:

·您可以创建一个默认运行时使用的可选语言(cpython的实现)——一个主要任务,但最终它将只是cpython的一个简单替代。

·您还可以使用一些速度优化器来重写现有的python代码,这意味着程序员在编写代码时会花费更多的精力,而不会在运行时更改代码。

如何优化python的性能是本文的主题。以下是在某些方面提高Python代码性能和执行效率的五种方法。

小编推荐一个学python的学习qun 740,3222,34
无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

PyPy

Pypy无疑是CPython的最佳替代品(Quora就是从中写出来的)。由于pypy与现有的python代码具有很高的兼容性,它也是默认程序运行时的一个很好的选择。

Pypy使用实时(JIT)即时编译器,这是一种动态编译器。与静态编译器(如GCC、Java等)不同,PyPy优化了程序运行过程的数据,并具有与谷歌浏览器V8 JavaScript引擎相同的语言加速技术。本月早些时候,将发布Pypy2.5的最新版本,并进行一系列性能改进,提供更全面的支持,如numpy,以加速Python性能共享库。

python 3.x必须从单独的pypy3项目中构建。但是,对于边缘语言功能的爱好者来说,虽然预期支持3.3,但实际版本最多只支持3.2.4及以下版本。

Pyston

Pyston是一款Dropbox推出的新的基于JIT的Python实现,使用LLVM编译器实现代码解析与转换。与PyPy相比,Pyston仍处于初级阶段,目前最新版本为Pyston 0.2版,支持有限子集语言的相关特性。Pyston的主要工作包括支持语言的核心功能及提升关键指标性能到一个可接受的水平。不久后,Pyston就可以被认为是远程生产就绪语言。

Nuitka

Nuitka 是一个Python的替代品,一些团队正用它做完全的Python编译工具,并尝试将Python代码转译为其它可高速运行的编程语言。Nuitka(nuitka.net)可以将python代码转换为C++代码,然后编译为可执行文件,并通过直接调用python的api的方式实现从解析语言到编译语言的转换,并且在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容。虽然这限制了它的可移植性,但不可否认这个转换的速度获得了肯定。

Cython

Cython是Python 的C语言扩展。准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的编译器:先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。不过Cython的缺点是,你并不能真正编写Python代码,这样一来,现有代码将不会完全自动转移成功。

也就是说,Cython在提速方面有很大优势,它是一个用来快速生成Python扩展模块(extention module)的工具。而在Cython,C里的类型,如int,float,long,char*等都会在必要的时候自动转成python对象,或者从python对象转成C类型,在转换失败时会抛出异常,这正是Cython最神奇的地方。另外,Cython对回调函数的支持也很好。总之,如果你有写python扩展模块的需求,那么Cython真的是一个很好的工具。

Numba

Numba综合了前两种方法,是Cython的竞争项目。同样的,numba把Python源码通过LLVMPy生成JIT后的.so文件来加速。不同点在于,Numba是以JIT为主的,加速对源码的侵入性较小。而Cython则重点在加速高性能Python模块的开发上,不依赖LLVMPy项目。此外numba还很不成熟,目前兼容性相当差。

总结

python的创始人guido van rossum认为,python的许多性能问题都可以归因于不恰当的语言使用。例如,对于占用太多CPU的处理,有一些方法可以加快python的运行速度——使用numpy、使用多处理器扩展或使用外部C代码来避免全局解释器锁(gil)——这是python运行缓慢的根本原因。但是,由于在Python中没有其他可行的Gil语言,所以在短期内(或者可能更长时间内)Python仍将落后于其他语言。