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

不论什么语言,我们都需要注意性能优化问题,提高执行效率。选择了脚本语言就要忍受其速度,这句话在某种程度上说明了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仍将在短期落后于其他语言——甚至可能更长时间。

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Linux | 只有十三个字符的经典Fork炸弹,讨厌谁就去整他吧!

Jaromil在2002年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在shell中运行后几秒后系统就会宕机: 这样看起来不是很好理解...

4166
来自专栏mwangblog

git,版本控制界的魔术师(1/18/2018)

1032
来自专栏老九学堂

【编程解惑】Java、JavaEE、JavaSE、Java Web、JavaScript有什么区别?

很多有想入门Java的小伙伴在听到Java那么多叫法的时候,是不是表示一脸懵逼,今天老九君就给大家捋一捋Java大家族间的分门别类。 ? Java分为:Jav...

3979
来自专栏纯洁的微笑

小明历险记:规则引擎Drools教程一

1293
来自专栏编程

C语言怎么学习?以C语言模拟登录为例,学C语言该当如此方可成

好了不用看了,看直了也不会有妹子,看题了: C语言编写代码实现,模拟用户登录------看着是不是很简单?,是不是很轻松?,是不是就有这样的代码? (小编随便百...

3909
来自专栏Java编程技术

Java并发编程之美

并发编程相比 Java 中其他知识点的学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/ 高流量系统的实现,却都离不开并发编程,于是能够真正掌...

2153
来自专栏用户画像

3.2.1虚拟内存的基本概念

②当大量作业要求运行时,由于内存不足以容纳所有作业,只能使少数作业先运行,导致多道程序度的下降。

1104
来自专栏机器学习算法与Python学习

为什么越来越多的人学习Python

Python, 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python...

3115
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十六)

那什么是模块呢?简单的讲,就是一些包装好的内容,当你要用到一些操作在这个模块中时,你就先要导入它

982
来自专栏linux驱动个人学习

SPI通讯协议

一、SPI概述 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通...

4217

扫码关注云+社区

领取腾讯云代金券