让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 相关文章推荐
c++生成dll使用python调用dll的方法
Jan 20 Python
python解析文件示例
Jan 23 Python
Python中的类与对象之描述符详解
Mar 27 Python
Python中Continue语句的用法的举例详解
May 14 Python
解读! Python在人工智能中的作用
Nov 14 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
Flask框架单例模式实现方法详解
Jul 31 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
解决python 上传图片限制格式问题
Oct 30 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python 5个实用的技巧
Sep 27 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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
Python运用于数据分析的简单教程
2015/03/27 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
医院总经理职责
2013/12/26 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
中学生班主任评语
2014/01/30 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
教师节校长致辞
2015/07/31 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis