为什么c++文件只能执行一次_numba从入门到精通(1)—为什么numba能够加速
真是哭了。。。为什么我之前写的numba教程全没了啊啊啊啊啊啊!!!!?????
只能从头整理了无语。
How Numba and Cython speed up Python coderushter.comhttps://blog.csdn.net/helloxiaozhe/article/details/78104975blog.csdn.net
参考链接见上。
首先回顾一下编译型语言和解释型语言(也经常叫脚本语言):
1、编译型语言,C、C++、Fortran、Pascal、Ada,由编译型语言编写的源程序需要经过编译,汇编和链接才能输出目标代码,然后由机器执行目标代码。目标代码是有机器指令组成,不能独立运行,因为源程序中可能使用了一些汇编程序不能解释引用的库函数,而库函数又不在源程序中,此时还需要链接程序完成外部引用和目标模板调用的链接任务,最后才能输出可执行代码。(例如我们编写c的时候引用了一个自定义的c库函数,则需要进行链接操作)
2、解释型语言,解释器不产生目标机器代码,而是产生中间代码,这种中间代码与机器代码不同,中间代码的解释是由软件支持的,不能直接使用在硬件上。该软件解释器通常会导致执行效率较低,用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。和编译的程序不同的是, 解释程序的任务是逐一将源代码的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码再执行。对于解释型语言,需要一个专门的解释器来执行该程序,每条语句只有在执行是才能被翻译,这种解释型语言每执行一次就翻译一次,因而效率低下
一、python编译过程概述
当我们执行Python代码的时候,在Python解释器用四个过程“拆解”我们的代码,最终被CPU执行返回给用户。
首先当用户键入代码交给Python处理的时候会先进行词法分析,例如用户键入关键字或者当输入关键字有误时,都会被词法分析所触发,不正确的代码将不会被执行。
下一步Python会进行语法分析,例如当"for i in test:"中,test后面的冒号如果被写为其他符号,代码依旧不会被执行。
下面进入最关键的过程,生成字节码,在执行Python前,Python会生成.pyc文件,这个文件就是字节码,如果我们不小心修改了字节码,Python下次重新编译该程序时会和其上次生成的字节码文件进行比较,如果不匹配则会将被修改过的字节码文件进行覆盖,以确保每次编译后字节码的准确性。
那么什么是字节码?字节码在Python虚拟机程序里对应的是PyCodeObject对象。.pyc文件是字节码在磁盘上的表现形式。简单来说就是在编译代码的过程中,首先会将代码中的函数、类等对象分类处理,然后生成字节码文件。有了字节码文件,通过python的解释器对字节码进行解释,将每一行的字节码解释成CPU可以直接识别的机器码,执行。
(补充:python解释器的类型有cpython、IPython、PyPy、Jython、IronPython:
Python解释器www.liaoxuefeng.com
)
所以,综上所属,python的整个从输入到输出的过程如下图:
我们常见的cpython解释器是用c语言的方式来解释字节码的,而numba则是使用LLVM编译技术来解释字节码的。
首先我们来看看numba的简单使用案例与加速情况:
import numpy as np
from numba import jita = np.arange(1, 10 ** 7)
b = np.arange(-10 ** 7, -1)@jit(nopython=True)
def sum_sequence(a, b):result = np.zeros_like(a)for i in range(len(a)):result[i] = a[i] - b[i]return result
然后我们通过dis进行反编译得到python的字节码:
>>> import dis
>>> dis.dis(sum_sequence)2 0 LOAD_GLOBAL 0 (np)2 LOAD_ATTR 1 (zeros_like)4 LOAD_FAST 0 (a)6 CALL_FUNCTION 18 STORE_FAST 2 (result)3 10 SETUP_LOOP 40 (to 52)12 LOAD_GLOBAL 2 (range)14 LOAD_GLOBAL 3 (len)16 LOAD_FAST 0 (a)18 CALL_FUNCTION 120 CALL_FUNCTION 122 GET_ITER>> 24 FOR_ITER 24 (to 50)26 STORE_FAST 3 (i)4 28 LOAD_FAST 0 (a)30 LOAD_FAST 3 (i)32 BINARY_SUBSCR34 LOAD_FAST 1 (b)36 LOAD_FAST 3 (i)38 BINARY_SUBSCR40 BINARY_SUBTRACT42 LOAD_FAST 2 (result)44 LOAD_FAST 3 (i)46 STORE_SUBSCR48 JUMP_ABSOLUTE 24>> 50 POP_BLOCK5 >> 52 LOAD_FAST 2 (result)54 RETURN_VALUE
我们之前写的cython本质上还是通过c的编译器来替换掉cpython底层的复杂代码从而实现了加速(比如python的动态类型,涉及到一大堆的类型检查、多态、溢出检查等耗时非常多,但是如果使用cython的静态类型就没有这么多麻烦的问题),
而numba的思路则不太一样,numba是在一个叫做LLVM的编译器上进行编译,Numba将Python字节码转换为LLVM中间表示(IR),请注意,LLVM IR是一种低级编程语言,与汇编语法类似,与Python无关。
Numba模式
Numba有两种模式:nopython
和object
。前者不使用Python运行时并生成没有Python依赖的本机代码。本机代码是静态类型的,运行速度非常快。而对象模式使用Python对象和Python C API,而这通常不会显着提高速度。在这两种情况下,Python代码都是使用LLVM编译的。
什么是LLVM?
LLVM是一个编译器,它采用代码的特殊中间表示(IR)并将其编译为本机(机器)代码。编译过程涉及许多额外的传递,其中LLVM编译器可以优化IR。LLVM工具链非常擅长优化IR,因此它不仅可以编译Numba的代码,还可以优化它。
整个系统大致如下:
Numba的优点:
- 便于使用
- 自动并行化
- 支持numpy操作和对象
- 支持调用GPU
Numba的缺点:
- debug非常麻烦
- 无法在
nopython
模式下与Python及其模块进行交互,numba目前在nopython模式下支持python模块有限,比如pandas是不支持的,但是不支持意味着无法加速并不意味着不能运行。 - 对python中的类class支持有限
为什么c++文件只能执行一次_numba从入门到精通(1)—为什么numba能够加速相关推荐
- python numba教程_numba从入门到精通(1)—为什么numba能够加速
真是哭了...为什么我之前写的numba教程全没了啊啊啊啊啊啊!!!!????? 只能从头整理了无语.How Numba and Cython speed up Python coderushter ...
- docker ubuntu 文件同步_Docker 的数据管理--Docker从入门到精通摘记
Docker 数据管理 用户在使用 Docker 的过程中,往往需要能够查看容器内应用产生的数据,或者说需要把容器内的数据进行备份,再或者说多个容器之间需要进行数据的共享,那么 ...
- sqlserver循环like变量_numba从入门到精通(6)—numba与循环与并行
多进程.多线程.并行的调用方式的不同以及python各种常用且优化较好的并行的处理方法,回头要总结一下,概念模糊很蒙蔽.我们这里介绍一下numba强大并且简单易用的并行功能. import numpy ...
- linux shell 执行多个文件,/etc/profile、~/.bash_profile等几个文件的执行过程
关于登录linux时,/etc/profile.~/.bash_profile等几个文件的执行过程. 在登录Linux时要执行文件的过程如下: 在 刚登录Linux时,首先启动 /etc/profil ...
- 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程
原文网址:http://blog.csdn.net/ithomer/article/details/6322892 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/ ...
- 关于登录linux时,/etc/profile、~/.bash_profile等几个文件的执行过程
关于登录linux时,/etc/profile.~/.bash_profile等几个文件的执行过程. 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile ...
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
- 多个python脚本同时执行_Python实现脚本锁功能(同时只能执行一个脚本)
1. 文件锁 脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件. 通过文件的判断来确定脚本是否正在执行. 方法实现也比较简单,这里以python脚本为例 #coding= ...
- xp 无法运行 php.exe,【xpexe文件不能执行】xp exe文件打不开_xp系统exe文件打不开-系统城...
2015-10-21 18:01:29 浏览量:10328 升级win10正式版后,很多用户都会立刻选择在新系统中安装一些自己常用的软件.不过,近来有位用户在win10中安装比较旧版软件时,却遇到了 ...
最新文章
- 【Learning Notes】线性链条件随机场(CRF)原理及实现
- Rocksdb 与 TitanDb 原理分析 及 性能对比测试
- 一个JS对话框,可以显示其它页面,
- 微服务和容器技术有风险,望君三思而后行
- Windows Phone开发:常用控件(上)
- pycharm 中按照文档引包方式,引包错误
- python读取文件的常用方法
- [算法总结] 二分查找
- 828c语言程序设计_21计算机考研只考一门高级语言程序设计的院校大汇总!
- 链表(Linked List)之单链表
- QEMU KVM libvirt手册(4) – images
- 微信公众平台体验之三(手机号归属)
- ubuntu18安装tim
- 转载 usb_alloc_coherent 和 usb_free_coherent
- 陈潭:大数据战略实施的实践逻辑与行动框架
- 摩根大通区块链支付网络计划于1月日本启动
- gifcam使用缩小内存_GifCam使用方法
- migo初始化库存 s4_货物移动_初始化库存(MvT561)
- 零基础PS----制作不一样的个人简历
- hive通过经纬度计算两地距离
热门文章
- python连接mysql失败_python连接mysql失败怎么解决
- C++ undefined reference to `__imp_WSACleanup‘解决方案
- matlab中未定义与 ‘cell‘ 类型的输入参数相对应的运算符 ‘+‘ 的解决方案
- 瑞银报告 | 美国银行业科技支出:凡有的,还要加给他,叫他有余...
- 记录一个crontab的中使用python脚本的坑
- 代码整洁之道(二)优雅注释之道
- 计算机图像类型ppt,计算机图像处理.ppt
- 关联省份与学校的级联HTML,JS实现的省份级联实例代码
- python如何运行代码_python上怎么跑(运行)代码
- html 倒计时关闭对话框,jquery倒计时广告特效代码 可关闭的js倒计时