作者 | Serdar Yegulalp

译者 | 姜松浩,责编 | 屠敏

转载自 CSDN(ID:CSDNnews)

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。

PyPy适用于运行时间较长的程序

PyPy优化Python程序的一个副作用是,运行时间较长的程序通过PyPy的优化获益最多。程序运行的时间越长,PyPy可以收集的运行时类型信息就越多,它可以进行的优化就越多。一劳永逸的Python脚本不会从这种事情中受益。例如受益的Python应用程序通常具有长时间循环运行的行为,或者在Web框架的后台中连续运行。

PyPy没有预编译

PyPy编译Python代码,但它不是Python代码的编译器。由于PyPy执行其优化的方式和Python的固有动态特点,因此无法将生成的JITted代码作为独立二进制文件发出并重新使用它。每次运行都必须编译每个程序。如果你想将Python编译成可以作为独立应用程序运行的更快的代码,那么还是请使用Cython、Numba或当前实验性的Nuitka项目。

原文:

https://www.infoworld.com/article/3385127/what-is-pypy-faster-python-without-pain.html

(*本文为 AI科技大本营转载文章,转载请联系原作者)

CTA核心技术及应用峰会

5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。

更多重磅嘉宾请识别海报二维码查看。CTA深度培训已经开课,主会议倒计时 1 天,少量余票即将售罄,欢迎点击阅读原文购票参会!更多详细信息15101014297,备注“CTA”,了解票务以及会务详情。

推荐阅读

  • 危机加剧:ARM釜底抽“芯”,华为腹背受敌

  • 面对996,程序员如何利用“碎片时间”涨薪?

  • 权威解读 GitHub、Apache 疑云:主流开源软件究竟是否会被闭源?

  • Kaggle季军新手笔记:利用fast.ai对油棕人工林图像进行快速分类(附Python代码)

  • 程序员连拿3份Offer,每份高达45K?他说做对了这些!

  • ARM到底是一家什么样的公司?

  • 为什么你写了一万小时的代码,却没能成为架构师?| 程序员有话说

  • 别怀疑,孩子在家里也能学编程!

  • 百花村区块链山的选民们, 超有趣!

点击阅读原文,了解CTA核心技术及应用峰会」

一个让Python代码运行更快的最佳方式!相关推荐

  1. 让 Python 代码运行更快的最佳方式!

    Python因其强大.灵活且易于使用等特性,而赢得了声誉.这些优点使其在各种各样的应用程序.工作流程和领域中得到了广泛应用.但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Pyth ...

  2. python 预编译加速_让Python代码运行更快的最佳方式

    Python因其强大.灵活且易于使用等特性,而赢得了声誉.这些优点使其在各种各样的应用程序.工作流程和领域中得到了广泛应用.但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Pyth ...

  3. python程序写完后点哪个运行快_让 Python 代码运行更快的最佳方式!

    PyPy与CPython PyPy是Python解释器CPython的直接替代品.CPython将Python编译为中间字节码然后由虚拟机解释,而PyPy使用实时(JIT)编译将Python代码转换为 ...

  4. C语言技巧:有if时使用likely和unlikely让代码运行更快

    在单片机/嵌入式编程中,对速度要求比较高,likely和unlikely就是一个比较好的技巧,适用于有if-else分支,且知道哪个发生概率大的情况​. 参考文章:C语言技巧:有if时使用likely ...

  5. 让书写的Matlab代码运行更快 Recipes for Faster Matlab Code

    Matlab 在 Research 中用得非常多,确实也是非常方便实用,只是有一个问题就是写 Matlab 代码的时候经常需要用一些比较奇怪独特的方式来思考和处理问题,否则写出来的代码虽然同样能工作, ...

  6. 使用 Numba 让 Python 计算得更快:两行代码,提速 13 倍

    Python 本身是一门运行较慢的语言,因此对于计算场景,最好的优化方式就是优化代码写法.你可以使用现有的科学计算库:比如 Numpy 和 Scipy.但如果想要在不使用低级语言(如 CPython. ...

  7. python移动图形工作站_让Python跑得更快

    原标题:让Python跑得更快 点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论,即有机会获得异步图书一本. Python很容易学.你之所以阅读本 ...

  8. 让Python跑得更快

    点击关注 异步图书 ,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论,即有机会获得异步图书一本. Python很容易学.你之所以阅读本文可能是因为你的代码现在能够正 ...

  9. python读csv最快方法_python读有汉字的csv如何让python变得更快?

    Python和其他脚本语言通常会被摒弃,因为它们相对于一些类似于C语言的编译型的语言来说效率很低.比如下面的斐波纳契数的例子: C语言中:int fib(int n){ if (n < 2) r ...

最新文章

  1. JAVA面向对象-----final关键字
  2. 如何使用jquery判断一个元素是否含有一个指定的类(class)
  3. tor screenrec屏幕录制+_ScreenFlow for mac(屏幕录制软件) v8.2.4中文版
  4. 记一次 .NET 某HIS系统后端服务 内存泄漏分析
  5. 建模分析师与算法工程师的主要区别
  6. [JavaWeb-MySQL]SQL基本概念,通用语法,分类
  7. dlut-KFQ人工智能导论答案1
  8. 商业认知,近期与部分中小创业者一起吃饭,忽然有人谈到现在创业越来越难
  9. WindowsForm如何实现类似微软project软件的甘特图?
  10. ES6 Set结构和Map结构(上)
  11. CentOS遇到Qt编译问题的解决方案(error: cannot find -lGL)
  12. 更换主板后 Win10 账户密钥集不存在 0x80090016问题解决
  13. matlab绘制正弦曲线
  14. 使用 brew 安装mongodb
  15. 解决 mac 蓝牙鼠标、键盘经常总是 断开连接的问题
  16. Java版电商购物系统说明
  17. Linux 服务器用上 SS Client
  18. 实现手机来电铃声,通知铃声、警告铃声等音频定制化功能(一,添加扫描分区myimage)
  19. Java进阶教程-马士兵
  20. SRS(简单实时视频服务) 笔记(3)- 配置文件和Http回调

热门文章

  1. AD上删除了Exchange容器,再重装时报'找不到企业组织容器
  2. Mail Archiving Expert电子邮件归档专家
  3. 字符串多模式精确匹配(脏字/敏感词汇/关键字过滤算法)——TTMP算法 之实战F模式...
  4. 对于索引(a,b,c),下列哪些说法是正确的
  5. mgr未同步 mysql_MySQL Group Replication(多主同步复制MGR)
  6. Python3 中实现MATLAB中的点乘 即两列表对应元素相乘
  7. java项目上有个红色感叹号(在project Explorer视图下)
  8. 20170215学习计划
  9. JOptionPane
  10. js实现页面跳转的几种方式