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

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项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea下拉项目_推荐几款非常好用的IDEA插件(香)

每天进步一点点,坚持下去,你总是会不一样的。加油!最近在整理Java常用的一些基础、ZooKeeper、Spring全家桶、源码、Dubbo、Elasticsearch、Redis、MySql、RabbitMQ、Kafka、Linux 、微服务等技术栈。持续更新中,欢迎点上面后端架…

python批处理代码_【原创源码】【python】python文本文件批处理

[Python] 纯文本查看 复制代码import osimport shutildef text_edit_vhd(filepath):with open(filepath,r) as file_head:content file_head.read()file_head.seek(0,0)file_head.write("protect begin \n" content)file_head.seek(0,2)file_head.write("\npr…

php 汉王云名片_汉王云-名片识别【最新版】_OCR_人工智能_API-云市场-阿里云

{"moduleinfo":{"advanList_count":[{"count_phone":4,"count":4}],"title":"云市场服务保障体系","mapList_count":[{"count_phone":4,"count":4}]},"advanList":[{&qu…

git 如何提取已提交的文件_git取两次提交的文件列表,包含目录信息

1.用git rev-list HEAD取得版本号列表:在SmartGit中看到的也是这样,验证了我们的猜想:取到两个版本号之后,用git diff命令:git diff [--options] ... [--] […​]这里的[-options]我们填的是--name-status,…

filco的pin码_一把强行帮你退烧的键盘 plum niz atom66静电容

一把强行帮你退烧的键盘 plum niz atom66静电容2019-09-10 10:37:578点赞17收藏14评论小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励无上限,点击查看活动详情说起niz,正是个神奇的牌子,老板一个人就负责制作…

在fritzing中怎么导入_电路图制作软件(Fritzing)

Fritzing,图形化Arduino电路开发软件。Fritzing是个电子设计自动化软件。它支持设计师,艺术家,研究人员和爱好者参加从物理原型到进一步实际的产品。还支持用户记录其阿尔杜伊诺和其他电子为基础的原型,与他人分享,在教…

得力助手 消防员的 消防机器人_消防机器人市场如今的发展现状,是否能成为消防员的得力助手...

随着经济的不断发展,使消防和应急救援的要求越来越高。基础工业的快速发展也使得易燃、易爆和剧毒化学品引发火灾的可能性越来越高。一方面,今天的消防需要更详细的消防信息和更快的消防和救援速度。另一方面,在改革后的消防系统建立后&#…

自己配置python环境_windows下python环境的配置

1 安装python类似其他软件,点击下一步就行了注意选择把python.exe加入到path中,当然也可以自己手动配置验证python是否安装成功>>>后面输入代码,可以立即看到结果,c语言等利用{}来界定代码块,python利用缩进来…

ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???

CodeWisdom-技术分享万万没想到!编译错误竟然还没灭绝???复旦大学CodeWisdom团队的代码分析和挖掘小组针对开源软件项目持续集成过程中出现的编译错误,进行了大规模的经验研究。该研究分析了常见的编译错误类型、修复代…

昆仑通态触摸屏数据转发上传_嵌_ModbusTcpIp数据转发 昆仑通态屏与屏之间通讯 - 下载 - 搜珍网...

嵌_ModbusTcpIp数据转发/通_通/发送方.MCG嵌_ModbusTcpIp数据转发/通_通/接收方.MCG嵌_ModbusTcpIp数据转发/通_通/驱动路径说明.txt嵌_ModbusTcpIp数据转发/通_通/ModBusTcp数据转发设备/ModbusTCPIPSlave.chm嵌_ModbusTcpIp数据转发/通_通/ModBusTcp数据转发设备/ModBusTCPIP…

直接用自己服务器做图床可以吗_图床有什么用,图片放自己的服务器上不可以吗?...

什么是图床服务器:图床就是图片在线存储服务器,主要是用来节省流量的,一些可以把图片存放到网上并且引用到其他网站使用的服务,就像以前的网络相册。一般用图床的,都是图片之类的静态文件非常多,把图片存储…

高职信息安全比赛攻防思路_高职信息安全技术应用技能竞赛.doc

高职信息安全技术应用技能竞赛.doc高职信息安全技术应用技能竞赛规程、评分标准及选手须知一、竞赛规程调整说明2011湖南省职业院校技能竞赛高职信息安全技术应用(以下简称“省赛”)竞赛规程,原则上采用“2011年全国职业院校技能大赛”高职信息安全技术应用(以下简称…

华宝小t股票机器人_华宝小T股票机器人

我试过两个品种,签约后会在管理介面标注算法对你持仓品种的效果(下挂多户时只支持添加默认主账户的持仓,且只限股票),我试了两个标注为优秀的,一个益生股份,一个宏辉果蔬。单个品种下限大概是6万左右,会提示…

catia直线测距怎么调出来_CATIA怎么测量两线夹角.

在几何学中,角是由两条有公共端点的射线组成的图形。这两条射线叫做角的边,它们的公共端点叫做角的顶点。一般的角会假设在欧几里得平面上,但在欧几里得几何中也可以定义角。角在几何学和三角学中有着广泛的应用。它是轴对称图形,…

深入剖析 linux GCC 4.4 的 STL string

转自: 深入剖析 linux GCC 4.4 的 STL string 本文通过研究STL源码来剖析C中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术。 平台:x86_64-redhat-linuxgcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)…

java scanner以回车结束_请问Scanner在输入回车后,如何才能退出?

package com.imooc;import java.util.Scanner;/*kernal* 功能描述:* 为指定成绩加分,直到分数大于等于 60 为止,* 输出加分前和加分后的成绩,并统计加分的次数.*/public class addScore {public static void main(String[] args) {System.out…

HTML列表标记符有哪些,在HTML中,表格标记符为( )

3. (2017高一上东台月考) 阅读下面一段资料,判断在给出的几种说法中不正确的是( )资料:IP电话与传统电话IP电话是按国际互联网协议规定的网络技术内容开通的电话业务,中文翻译为网络电话或互联网电话,它是利用国际互联网Inetrne…

Linq 实现左连接,右连接

左连接: var LeftJoin from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals dept.ID into JoinedEmpDept from dept in JoinedEmpDept.DefaultIfEmpty() select new { EmployeeName emp.Name, DepartmentName dept ! null ? de…

python怎样执行curl命令_python curl命令

今天下午来到,运行了curl -i url:port ,然后返回的信息,用json.loads()解析,出报一下错误:Traceback (most recent call last):File "test1.py", line 12, in decodejson json.loads(str1)File "/usr/…

用计算机心如止水,计算机网络数据链路层

1、数据链路层使用的信道类型:点对点信道(1对1)广播信道(1对多),如:集线器、交换机2、链路与数据链路:链路:点对点的物理线路段,中间无任何其他交换结点数据链路:通信协议 软件 硬件(一般用适…