专栏首页实验盒嫌Python太慢但又不想学C/C++?来了解下JIT技术

嫌Python太慢但又不想学C/C++?来了解下JIT技术

什么是 JIT

Python 是门多才多艺的语言,既可以写后端,也可以做数据分析,既可以智能化运维,也可以搞渗透,既可以写爬虫,又可以做机器学习深度学习。然而,Python 的缺点也很明显,它的速度有点慢。

我们从官方网站下载到的版本,默认是采用了 CPython 解释器,它也是用得最广的解释器。以 CPython 为例,看看它的执行过程。Pyhton 代码(.py 文件)在运行时,解释器把源代码变为一组虚拟机指令,也就是“字节码”(.pyc 文件)。这些字节码指令,是运行在 Python 虚拟机上的。因为这些是运行在虚拟机的,自然而然就比 C/C++ 等可以编译为机器码的语言慢很多。当然,影响执行效率的因素还有很多,这里就不叙述。

如果对高性能有非常迫切的需求,最好的解决方案是用 C/C++ 。不过,C/C++ 的学习难度比 Python 大很多,不是那么容易。除了换编程语言外,还有个更为容易的方法,那就是 JIT。

Just-In-Time(JIT),也就是即时编译,它为解释语言提供了一种优化。通俗地来说,就是代码在运行时,实时编译为机器码。这样,程序就可以跳过虚拟机直接在硬件上运行,执行速度大幅提高。

JIT 技术在 Java 中使用非常广泛。不过在 Python 中,以往 JIT 并不完善,听说过的人很少。

下面就介绍两种 Python 的解决方案。

Numba

Numba 是一个 开源的 JIT编译器,采用了 LLVM。它支持 Python 的原生函数和 Numpy,可以在 x86、x86_64、ppc64、armv7l、armv8l 等架构上运行,支持 Windows、MacOS 和 Linux。

Numba 的使用非常简单,无需更换 Python 的解释器。举一个简单的例子,只需要在函数上加上一个装饰器,Numba 就会自动将这些代码编译成机器码:

from numba import jit
import random

@jit(nopython=True)def monte_carlo_pi(nsamples):
    acc = 0
    for i in range(nsamples):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            acc += 1
    return 4.0 * acc / nsamples

PyPy

PyPy 是 Armin Rigo开发的动态编译器,基于 Trace 的 JIT 技术,对源码进行动态编译(不是动态解释),可以显著提高执行速度。它历史非常悠久,1.0 版本在 2007 年发布。目前支持大多数标准库,在 Python 2.7 和 3.6 上都能使用。它可以在 x86、x86_64、ARMv6、ARMv7、AArch64PowerPC 64bit、System Z 等架构上运行,支持 Linux、MacOS、Windows、OpenBSD、FreeBSD 等系统。不过,在非 x86 架构上,它只能支持 Linux。

但它有个缺点,那就是不支持支持官方的 CPython,因而无法使用 Numpy、Scipy 等常用的重要第三方库。另外,PyPy 在使用上与 CPython有些不同,具体可看 https://doc.pypy.org/en/latest/cpython_differences.html,需要注意。

总结

Python 的 JIT 技术还不是很完善,但 Numba 已经可以满足一大部分的计算需要。至于 PyPy,个人而言不太推荐。感兴趣的不妨试试 Numba。

本文分享自微信公众号 - 实验盒(gh_8a85afc0b064),作者:实验盒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-05

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python | 加一行注释,让你的程序提速10+倍!numba十分钟上手指南

    之前的文章《源代码如何被计算机执行》已经提到计算机只能执行二进制的机器码,C、C++等编译型语言依靠编译器将源代码转化为可执行文件后才能运行,Python、Ja...

    PP鲁
  • Python 为什么这么慢?

    大家好,我是猫哥。今天分享一篇文章,讨论了拖慢 Python 整体性能的三大原因。在开始正文之前,需要说明一下(免得有人误以为 Python 慢就不值得使用):...

    Python猫
  • 计算机基础系列:源代码如何被计算机执行

    现在各行各业的朋友都开始使用计算机解决自己的业务问题,网络上有大量的免费公开课,教我们处理数据并数学建模。Python等编程语言上手快,开源软件多,足以应付绝大...

    PP鲁
  • 如何让python的运行速度得到提升

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。

    砸漏
  • HHVM 是如何提升 PHP 性能的?

    HHVM 是 Facebook 开发的高性能 PHP 虚拟机,宣称比官方的快9倍,我很好奇,于是抽空简单了解了一下,并整理出这篇文章,希望能回答清楚两方面的问题...

    猿哥
  • 为什么 Python 这么慢?

    对于一个类似的程序,Python 要比其它语言慢 2 到 10 倍不等,这其中的原因是什么?又有没有改善的方法呢?

    sergiojune
  • pypy真的能让python比c还快?

    最近 “pypy为什么能让python比c还快” 刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。

    州的先生
  • 一行代码让你的python运行速度提高100倍

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。

    小小詹同学
  • Python 为何能坐稳 AI 人工智能 的 头牌语言

    在这里我要明确表个态,对于希望加入到 AI 和大数据行业的开发人员来说,把鸡蛋放在 Python 这个篮子里不但是安全的,而且是必须的。或者换个方式说,如果你将...

    一墨编程学习
  • 为什么Python这么慢?

    Python语言近年来人气爆棚。它广泛应用于网络开发运营,数据科学,网络开发,以及网络安全问题中。

    大数据文摘
  • 程序员迁移模式

    上图中红颜色标记了目前最常见的“终端节点”(所谓终端节点是人们在这里停下来因为他们找不到更好的东西)。终端节点是:Rust,Java,Go,Python 3,J...

    MavenTalker
  • 使用numba加速python科学计算

    python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病。纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的pytho...

    DechinPhy
  • 这一行代码,能让你的 Python 运行速度提高 100 倍!

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。

    杰哥的IT之旅
  • 快过C语言?!还有这种操作?!

    Python向来都是开发速度最快,运行速度最慢的编程语言,提升速度的办法我之前讲过几种,比如和C语言交互,使用多进程。仅仅靠这两个方法来提高Python性能可是...

    不可言诉的深渊
  • Java架构师学习路线图

    学习一下你的集成开发环境提供的调试工具,加一些断点试试。

    Java后端工程师
  • ​一种新的DSL生成和通用语言框架:pypy

    本文关键字:DSL框架和自动化生成工具,pypy as dsl framework and jit framework

    minlearn
  • 为什么Python这么慢?

    答案在很大程度上取决于您正在运行的应用程序的类型。没有一个基准测试是完美的,但是计算机语言基准测试游戏是一个很好的起点。

    HuangWeiAI
  • 为什么C语言仍然占据统治地位?

    导读:C语言五十年来一直是软件开发的一种主力语言。本文介绍它在如今的2019年与C++,Java,C#,Go,Rust和Python抗衡的方式。

    华章科技
  • 为什么 C 语言仍然占据统治地位?

    没有什么技术可以应用长达50年之久,除非它真的比大多数其他东西都要好用——对于一种计算机行业的技术来说尤其如此。自1972年诞生以来,C语言一直保持生龙活虎的状...

    Python猫

扫码关注云+社区

领取腾讯云代金券