
文章插图
作者 | Serdar Yegulalp译者 | 姜松浩,责编 | 屠敏转载自 CSDN(ID:CSDNnews)【个让Python代码运行更快的最佳方式!】Python因其强大、灵活且易于使用等特性,而赢得了声誉 。这些优点使其在各种各样的应用程序、工作流程和领域中得到了广泛应用 。但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Python总是比C或C ++这样的机器本地语言慢一个数量级 。
多年来,开发人员已经为Python的速度限制提出了各种变通方法 。例如你可以在C中编写性能密集型任务并使用Python封装它,许多机器学习库正是这样做的 。或者你可以使用Cython,这个项目可以将Python种加上运行时类型信息以便编译为C,通过这种方式来允许你使用Python代码 。
但变通办法从来都不是理想的 。如果我们能够按原样使用现有的Python程序并以更快的速度运行它,那不是很好吗?这正是PyPy允许你做的事情 。
PyPy与CPython
PyPy是Python解释器CPython的直接替代品 。CPython将Python编译为中间字节码然后由虚拟机解释,而PyPy使用实时(JIT)编译将Python代码转换为本地机器的汇编语言 。
根据正在执行的任务,性能提升可能会非常显着 。平均而言,PyPy将Python加速了大约7.6倍,一些任务加速了50倍或更多 。CPython解释器根本不会执行与PyPy一样的优化方式,并且可能永远不会,因为这不是它的设计目标之一 。
最好的部分是开发人员需要很少甚至不需要努力来解锁PyPy提供的收益 。只需将CPython替换为PyPy,并且大部分都已完成 。下面讨论了一些例外,但是PyPy的目标是运行现有的,并且未经修改的Python代码并为其提供自动化的速度提升 。
PyPy目前通过项目的不同版本支持Python 2和Python 3 。换句话说,你需要下载不同版本的PyPy,具体取决于你运行的Python版本 。PyPy的Python 2分支已经存在了很长时间,但到目前为止,python 3版本的速度已经提高了很多 。PyPy目前支持Python 3.5(发布版本)和Python 3.6(beta版本) 。
除了支持所有核心Python语言外,PyPy还可以与Python生态系统中的绝大多数工具配合使用,例如用于打包的pip或用于虚拟环境的virtualenv 。大多数Python软件包,即使是那些带有C模块的软件包,都会按照原样运行 。当然,也存在一些限制,我们将在下面介绍一些限制 。
PyPy如何工作
PyPy使用其他即时编译器中的动态语言优化技术 。它分析运行的Python程序,以确定在程序中创建和使用对象时的类型信息,然后使用该类型信息作为指导来加快速度 。例如,如果Python函数仅使用一种或两种不同的对象类型,PyPy会生成机器代码来处理这些特定情况 。
PyPy的优化是在运行时自动处理,因此你通常不需要调整其性能 。高级用户可能会尝试使用PyPy的命令行选项来为特殊情况生成更快的代码,但这种情况通常很少需要 。
PyPy也脱离了CPython处理一些内部函数的方式,但它同时试图保留兼容的行为 。例如PyPy处理垃圾回收的方式与CPython不同 。并非所有对象一旦超出范围就立即回收,所以在PyPy下运行的Python程序可能比在CPython下运行时显示占用更大的内存 。但你仍然可以使用通过gc模块公开的Python高级垃圾回收控件,例如gc.enable(),gc.disable()和gc.collect()等等 。
如果你想在运行时获得有关PyPy的JIT(实时)行为的信息,PyPy包含一个模块pypyjit,它向你的Python应用程序公开了许多JIT关联信息 。如果你的某个功能或模块在JIT上表现不佳,那么pypyjit可以让你获得有关它的详细统计信息 。
另一个特定于PyPy的模块,__pypy__暴露了PyPy特有的其他功能,因此对于编写利用这些功能的应用程序非常有用 。由于Python的运行的动态性,有可能构建在PyPy存在时使用这些功能的Python应用程序,而在不存在时忽略它们 。
PyPy的限制
可能看PyPy起来像魔法一样神奇,但其实它并不神奇 。PyPy同样具有某些限制,可以削弱或消除某些程序的有效性 。唉,PyPy不是CPython运行时的完全的通用替代品 。
PyPy最适合纯Python的应用程序
PyPy在“纯”Python应用程序中表现最佳,换句话说也就是用Python编写的没有夹杂其他语言的应用程序中表现最佳 。由于PyPy模仿CPython的本机二进制接口的方式,与C库(如NumPy)接口的Python包也没有那么出类拔萃了 。
PyPy的开发人员已经解决了这个问题,并使PyPy与大多数依赖于C扩展的Python包更加兼容 。例如Numpy现在与PyPy兼容的非常好 。但是,如果你希望与C的扩展最大程度地兼容,请使用CPython 。
推荐阅读
- Python超详细的字符串用法大全
- 140种Python标准库、第三方库和外部工具都有了
- 格力空调故障代码,拿个小本本记下来
- Python函数式编程,Python闭包
- Python接口测试自动化实战及代码示例:含get、post等方法
- 教你如何优雅地用Python连接MySQL数据库
- 为什么 if-else 不是好代码
- 基于python语言的大数据搜索引擎
- 常见加密方式和Python实现
- 网站植入抓取代码 窃取手机访客隐私
