什么是 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。

python不想学了-嫌Python太慢但又不想学C/C++?来了解下JIT技术相关推荐

  1. python 多核并行计算_手把手 | 嫌Python太慢?并行运算Process Pools三行代码给你4倍提速!...

    大数据文摘作品,转载要求见文末 作者 | Adam Geitgey 编译 | 元元.Lisa.Saint.Aileen 原文链接 | https://medium.com/@ageitgey/quic ...

  2. 好想学python怎么玩_我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!

    你想问我怎么玩的? 很简单啊, 就一个字: 跳! 大家都在跳 为什么有的人能称霸朋友圈 有的人只有几百分呢 达妹给你整理了游戏攻略 (分普通版和进阶版哦) ▼ 游戏攻略拿高分 普通版本的高分秘籍是这样 ...

  3. 学python后到底能干什么-学会Python后都能做什么?网友们的回答简直不要太厉害...

    如今,越来越多的人加入到学习Python的队伍当中. 有的学习者是设计师,学习Python可以帮助他们查找更多的海报案例:有的学习者是大学生,学习Python可以帮助他们更好地查阅论文资料:还有的学习 ...

  4. python程序运行按什么键_太惨!学Python方法用错,直接从入门到放弃!

    原标题:太惨!学Python方法用错,直接从入门到放弃! 从你开始学习编程的那一刻起,就注定了以后所要走的路-从编程学习者开始,依次经历实习生.程序员.软件工程师.架构师.CTO等职位的磨砺:当你站在 ...

  5. 对python的认识2000字_2000字谏言,给那些想学Python的人,建议收藏后细看!

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 不识庐山真面目,只缘身在此山中. ...

  6. 嫌Python太慢了?让Cython带你飙车吧

    很多人仅在性能方面将Python与C进行了比较,没有在快速开发方面比较,就开始抱怨Python太慢了.Python的优点在于,其开发时间非常短,你不必处理指针.内存管理等问题. 多数情况下,开发时间比 ...

  7. 【python零基础入门学习】Python入门,带你快速学习为什么那么多人想学 Python?

    最近,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJF1cH ...

  8. java串口编程程序_想成为程序员,学编程,Python、Go、Java、C++,你选什么?

    很多时候,我们都不得不做出选择.就拿想成为程序员学编程这件事来说,想学一门编程语言,是选择最新潮的Python.Go,还是选择比较传统的JAVA和C++呢? 要做出选择,就得先进行比较. 其实不同编程 ...

  9. 想学python买什么书好-看了许多python书后!我发现学好python这三本书必看

    我为什么这么热衷于python 大学学了C和java,但大学毕业后,C和java这些对我都不是很友好,在一个偶然的机会,需要用到python,从那以后我就爱上了这门语言. 从开始使用python至今4 ...

最新文章

  1. JAVA企业级应用TOMCAT实战
  2. myeclipse10.7安装git插件
  3. Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换
  4. 175 道面试必考 Go 语言题目详细解答
  5. Spring集成Quartz定时任务框架介绍
  6. 阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析
  7. mysql心得笔记_mysql总结笔记
  8. PHP实现Restful风格的API(转)
  9. python 拼音 四线格_拼音四线三格中的写法示意及书写注意事项
  10. [树莓派][GPIO][风扇][断点直播]树莓派4B加装风扇并实现风力和CPU温度控制
  11. JAVA获取CKplayer真是地址,ckplayer的使用问题
  12. smartbi服务器缓存文件,导出资源 - Smartbi V10帮助中心 -
  13. I MM CO T-CODE
  14. MSP430-流水灯和key
  15. mysql连接navicat premium 15的具体方法 附navicat的官网连接
  16. Chapter 4 Part 5 WPAS扫描源码走读
  17. C语言写出猜数字游戏的代码
  18. 第7章 项目成本管理
  19. 算法设计题3.16-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版
  20. 【飞鱼科技】最新社招信息

热门文章

  1. jQuery 的选择器
  2. 如何解决Android 5.0中出现的警告:Service Intent must be explicit
  3. Eclipse使用新手教程
  4. dial tcp 10.96.0.1:443: getsockopt: no route to host --- kubernetes(k8s)DNS 服务反复重启
  5. ADO.NET——二级联动 +ajax
  6. List集合2-LinkedList
  7. java——原型模式
  8. Selenium常用方法及函数、txt参数化
  9. jQuery 1.9+ ajaxStart事件无效,无法被触发的原因。
  10. Servlet开发配置