我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 执行例程 >

一个让Python代码运行更快的最佳方式

归档日期:07-05       文本归类:执行例程      文章编辑:爱尚语录

  多年来,开发人员已经为Python的速度限制提出了各种变通方法。例如你可以在C中编写性能密集型任务并使用Python封装它,许多机器学习库正是这样做的。或者你可以使用Cython,这个项目可以将Python种加上运行时类型信息以便编译为C,通过这种方式来允许你使用Python代码。

  但变通办法从来都不是理想的。如果我们能够按原样使用现有的Python程序并以更快的速度运行它,那不是很好吗?这正是PyPy允许你做的事情。

  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使用其他即时编译器中的动态语言优化技术。它分析运行的Python程序,以确定在程序中创建和使用对象时的类型信息,然后使用该类型信息作为指导来加快速度。例如,如果Python函数仅使用一种或两种不同的对象类型,PyPy会生成机器代码来处理这些特定情况。

  PyPy的优化是在运行时自动处理,因此你通常不需要调整其性能。高级用户可能会尝试使用PyPy的命令行选项来为特殊情况生成更快的代码,但这种情况通常很少需要。

  PyPy也脱离了CPython处理一些内部函数的方式,但它同时试图保留兼容的行为。例如PyPy处理垃圾回收的方式与CPython不同。并非所有对象一旦超出范围就立即回收,所以在PyPy下运行的Python程序可能比在CPython下运行时显示占用更大的内存。但你仍然可以使用通过gc模块公开的Python高级垃圾回收控件,例如gc.enable(),gc.disable()和lect()等等。

  如果你想在运行时获得有关PyPy的JIT(实时)行为的信息,PyPy包含一个模块pypyjit,它向你的Python应用程序公开了许多JIT关联信息。如果你的某个功能或模块在JIT上表现不佳,那么pypyjit可以让你获得有关它的详细统计信息。

  另一个特定于PyPy的模块,__pypy__暴露了PyPy特有的其他功能,因此对于编写利用这些功能的应用程序非常有用。由于Python的运行的动态性,有可能构建在PyPy存在时使用这些功能的Python应用程序,而在不存在时忽略它们。

  可能看PyPy起来像魔法一样神奇,但其实它并不神奇。PyPy同样具有某些限制,可以削弱或消除某些程序的有效性。唉,PyPy不是CPython运行时的完全的通用替代品。

  PyPy在“纯”Python应用程序中表现最佳,换句话说也就是用Python编写的没有夹杂其他语言的应用程序中表现最佳。由于PyPy模仿CPython的本机二进制接口的方式,与C库(如NumPy)接口的Python包也没有那么出类拔萃了。

  PyPy的开发人员已经解决了这个问题,并使PyPy与大多数依赖于C扩展的Python包更加兼容。例如Numpy现在与PyPy兼容的非常好。但是,如果你希望与C的扩展最大程度地兼容,请使用CPython。

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

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

  在说任意比例分割查找之前我们先来谈谈黄金分割查找与二分查找:在二分查找中,我们是取中旬等于左向右和的中间值,即用等分的方法进行查找。那为什么一定要等分呐?能不能进行“黄金分割”?也就是中间=左+0.6...博文来自:acDream_的博客

  题目一条包含字母A-Z的消息通过以下方式进行了编码:A-gt;1B-gt;2...Z-gt;26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例1:...博文来自:的博客

  一般的排序方法的复杂度是O(n^2),这里介绍一下复杂度为O(nlogn)的更好的算法。这类算法的好处就是采用了分而治之的策略。也就是说,每一个算法都是找到了一种方法,将列表分解为更小的子列表。随后这...博文来自:qidaxiang66的博客

  同学阿里三面面试官的一道面试题是:二叉树每个节点都保存一个整数,想要求所有节点数值之和,哪种遍历方式最快?首先定义二叉树structTree{intval;Tree*left;Tree*right;T...博文来自:na_beginning的专栏

  假设有一个班级的小学生去操场上体育课,体育老师要求他们按照身高次序站成一队。每个小学生都知道自己的具体身高是多少厘米(假设每个小学生身高都不一样,否则就会为争执位置打架),但每个小学生都不承认别人比自...博文来自:鉏飞祥的博客

  ProblemDescriptionsnow是个热爱打字的家伙,每次敲出更快的速度都会让他很开心。现在,他拿到一篇新的打字文章,已知这篇文章只有26个小写英文字母,给出snow打出这26个英文字母分别...博文来自:小坏蛋_千千

  昨天,同事给我推荐了一部剧,叫《大明王朝1566》,号称是跟《走向共和》同级别的国产电视剧经典之作,特别是其中堪比于莎士比亚的华丽的台词,让人叹不绝口。随即我半开玩笑的说了句:这么有文学性的电视剧,我...博文来自:weixin_34275734的博客

  强烈建议教育网用户使用中科网源,本人实测最高网速能达到32M/s!(是M/s不是Mbit/s。...

  更快的Python(PythonFasterWay)使用代码示例来说明如何书写Python代码能带来更高的性能。本文对代码进行了讲解,从性能和可读性等角度来选择出最适合的写法。例子1:字符串格式化最差...

  ubuntu,我们在使用apt新装软件的时候,会使用官方的网站去下载软件,但是会因为国内的转接点太多,而导致下载的速度非常慢,我们可以通过换成一些国内的同步镜像源来进行下载,比如阿里源、清华源等,速度...

  Python代码运行助手可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码。原理如下:在网页输入代码:点击Run按钮,代码被发送到本机正在运行的Python代码运行助手...

  序:之前在一篇关于vector的push_back和resize()等方式读取数据的效率对比中,我们发现最快的是通过读入优化。这次将测试四种读入方式的效率对比:两种读入优化,scanf与fscanf。...

  题目:如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。给定k和n,请返回k的n次方,为了防止溢出,请返...

  专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09=(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。下面就请你写个程序,为任意一位用...

  ai 游戏 python pygame 一个简单游戏ai的实现--让电脑自己愉快的打飞机

  数学王子高斯小时候就能利用规律很快的将1+2+……+100算出来。现在有一个更有趣的问题,要求1+2+……+10^n,你能像高斯一样快速求出结果吗? Input 第一行有一个整数t,表示有t组数据,以下一共t行,每行一个整数n,...

  【1】win+R打开电脑的运行界面,输入cmd。【2】出现黑框,在里面输入chkdsk,点击确定,自动开始运行。如果出现[访问被拒绝,因为你没有足够的特权,你必须调用这个在提升模式下运行的实用程序]点...

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:

  u013613428:感谢分享 已关注您的博客,感谢您也关注下我的博客:

本文链接:http://guidoon.com/zhixinglicheng/229.html