让Python代码更快运行的5种方法


Posted in Python onJune 21, 2015

不论什么语言,我们都需要注意性能优化问题,提高执行效率。选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮。尽管Python从未如C和Java一般快速,但是不少Python项目都处于开发语言领先位置。
Python很简单易用,但大多数人使用Python都知道在处理密集型cpu工作时,它的数量级依然低于C、Java和JavaScript。但不少第三方不愿赘述Python的优点,而是决定自内而外提高其性能。如果你想让Python在同一硬件上运行得更快,你有两个基本选择,而每个都会有一个缺点:
·您可以创建一个默认运行时所使用的替代语言(CPython的实现)——一个主要的任务,但它最终只会是CPython的一个简易替代者。
·您也可以利用某些速度优化器重写现有Python代码,这意味着程序员要花更多精力编写代码,但不需要在运行时加以改变。
如何进行Python性能优化,是本文探讨的主题。下面是五个方法可以在某些方面提高Python代码的性能和执行效率。

PyPy

在选择CPython的简易替代语言时,PyPy无疑是最佳之选(如Quora就是由它编写而成)。由于与现有Python代码保持高度兼容性,PyPy也是默认程序运行时的一个很好选择。
PyPy使用了Just-in-Time(JIT)即时编译器,即动态编译器,与静态编译器(如gcc,java等)不同,它是利用程序运行的过程的数据进行优化,拥有同谷歌Chrome V8 JavaScript引擎相同的语言加速技术。本月初,最新版本PyPy 2.5即将发布,此版本会有一系列的性能改进,提供更全面的如NumPy的支持,用于加速Python性能的共享库。
Python 3.x必须由单独的PyPy3项目构建而成。不过,对于边缘语言特性 爱好者来说,尽管预期支持3.3,但实际此版本最多仅支持Python3.2.4及以下版本。
相关链接:http://pypy.org/

Pyston

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

Nuitka

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

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真的是一个很好的工具。
相关链接:http://cython.org/

Numba

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

Python创始人Guido van Rossum坚信Python的许多性能问题可以归结为语言的使用不当。例如,对于CPU消耗过高的处理,可以通过一些方法来加速Python运行——使用NumPy、使用多处理器扩展、或借助外部C代码从而避免全局解释器锁(GIL)——Python缓慢的根源。但由于在Python中还没有可行的GIL替代语言,Python仍将在短期落后于其他语言——甚至可能更长时间。

Python 相关文章推荐
python利用elaphe制作二维条形码实现代码
May 25 Python
python删除列表内容
Aug 04 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
python实现报表自动化详解
Nov 16 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
Python实现购物车程序
Apr 16 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
pygame实现贪吃蛇游戏(下)
Oct 29 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
在keras下实现多个模型的融合方式
May 23 Python
python的setattr函数实例用法
Dec 16 Python
Python文件读取的3种方法及路径转义
Jun 21 #Python
Python多线程和队列操作实例
Jun 21 #Python
Python中type的构造函数参数含义说明
Jun 21 #Python
Python base64编码解码实例
Jun 21 #Python
python在控制台输出进度条的方法
Jun 20 #Python
python压缩文件夹内所有文件为zip文件的方法
Jun 20 #Python
Python写的一个简单监控系统
Jun 19 #Python
You might like
PHP生成静态页面详解
2006/12/05 PHP
php知道与问问的采集插件代码
2010/10/12 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python解析文件示例
2014/01/23 Python
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
python使用opencv进行人脸识别
2017/04/07 Python
python实现装饰器、描述符
2018/02/28 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
Linux操作面试题
2012/05/16 面试题
业务员岗位职责
2013/11/16 职场文书
党建示范点实施方案
2014/03/12 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android