1.1。Numba的约5分钟指南 Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执行,并且您的全部或部分代码随后可以以本机机器代码速度运行!

开箱即用的Numba使用以下方法:

操作系统:Windows(32位和64位),OSX和Linux(32位和64位) 架构:x86,x86_64,ppc64le。在armv7l,armv8l(aarch64)上进行实验。 GPU:Nvidia CUDA。AMD ROC的实验。 CPython的 NumPy 1.10 - 最新 1.1.1。我怎么得到它? Numba可作为畅达包为 蟒蛇Python发布:

$ conda install numba Numba还有pip可供选择:

$ pip install numba Numba也可以 从源代码编译,虽然我们不建议首次使用Numba用户。

Numba通常用作核心包,因此其依赖性保持在绝对最小值,但是,可以按如下方式安装额外的包以提供其他功能:

scipy- 支持编译numpy.linalg功能。 colorama - 支持回溯/错误消息中的颜色突出显示。 pyyaml - 通过YAML配置文件启用Numba配置。 icc_rt - 允许使用Intel SVML(高性能短矢量数学库,仅限x86_64)。安装说明在 性能提示中。 1.1.2。Numba会为我的代码工作吗? 这取决于你的代码是什么样的,如果你的代码是以数字为导向的(做了很多数学运算),经常使用NumPy和/或有很多循环,那么Numba通常是一个不错的选择。在这些例子中,我们将应用最基本的Numba的JIT装饰器,@jit试图加速一些函数来演示哪些有效,哪些无效。

Numba在代码看起来像这样:

from numba import jit import numpy as np

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) # Set "nopython" mode for best performance def go_fast(a): # Function is compiled to machine code when called the first time trace = 0 for i in range(a.shape[0]): # Numba likes loops trace += np.tanh(a[i, i]) # Numba likes NumPy functions return a + trace # Numba likes NumPy broadcasting

print(go_fast(x)) 对于看起来像这样的代码,如果有的话,它将无法正常工作:

from numba import jit import pandas as pd

x = {'a': [1, 2, 3], 'b': [20, 30, 40]}

@jit def use_pandas(a): # Function will not benefit from Numba jit df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame df += 1 # Numba doesn't understand what this is return df.cov() # or this!

print(use_pandas(x)) 请注意,Numba不理解Pandas,因此Numba只是通过解释器运行此代码,但增加了Numba内部开销的成本!

1.1.3。什么是nopython模式? Numba @jit装饰器从根本上以两种编译模式运行, nopython模式和object模式。在go_fast上面的例子中, nopython=True在@jit装饰器中设置,这是指示Numba在nopython模式下操作。nopython编译模式的行为本质上是编译装饰函数,以便它完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方式,因为它可以带来最佳性能。

如果编译nopython模式失败,Numba可以编译使用 ,如果没有设置,这是装饰器的 后退模式(如上例所示)。在这种模式下,Numba将识别它可以编译的循环并将它们编译成在机器代码中运行的函数,并且它将运行解释器中的其余代码。为获得最佳性能,请避免使用此模式objectmode@jitnopython=Trueuse_pandas

1.1.4。如何衡量Numba的表现? 首先,回想一下,Numba必须为执行函数的机器代码版本之前给出的参数类型编译函数,这需要时间。但是,一旦编译完成,Numba会为所呈现的特定类型的参数缓存函数的机器代码版本。如果再次使用相同的类型调用它,它可以重用缓存的版本而不必再次编译。

测量性能时,一个非常常见的错误是不考虑上述行为,并使用一个简单的计时器来计算一次,该计时器包括在执行时编译函数所花费的时间。

例如:

from numba import jit import numpy as np import time

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) def go_fast(a): # Function is compiled and runs in machine code trace = 0 for i in range(a.shape[0]): trace += np.tanh(a[i, i]) return a + trace

DO NOT REPORT THIS... COMPILATION TIME IS INCLUDED IN THE EXECUTION TIME!

start = time.time() go_fast(x) end = time.time() print("Elapsed (with compilation) = %s" % (end - start))

NOW THE FUNCTION IS COMPILED, RE-TIME IT EXECUTING FROM CACHE

start = time.time() go_fast(x) end = time.time() print("Elapsed (after compilation) = %s" % (end - start)) 这,例如打印:

Elapsed (with compilation) = 0.33030009269714355 Elapsed (after compilation) = 6.67572021484375e-06 衡量Numba JIT对您的代码的影响的一个好方法是使用timeit模块函数来执行时间,这些函数测量多次执行迭代,因此可以在第一次执行时适应编译时间。

作为旁注,如果编译时间成为问题,Numba JIT支持 编译函数的磁盘缓存,并且还具有Ahead-Of-Time编译模式。

1.1.5。它有多快? 假设Numba可以在nopython模式下运行,或者至少编译一些循环,它将针对您的特定CPU进行编译。加速因应用而异,但可以是一到两个数量级。Numba有一个 性能指南,涵盖了获得额外性能的常用选项。

1.1.6。Numba如何运作? Numba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息相结合。它分析并优化您的代码,最后使用LLVM编译器库生成函数的机器代码版本,根据您的CPU功能量身定制。每次调用函数时都会使用此编译版本。

1.1.7。其他感兴趣的东西: Numba有相当多的装饰,我们看到@jit和@njit,但也有:

@vectorize- 生成NumPy ufunc(ufunc支持所有方法)。文件在这里。 @guvectorize- 产生NumPy广义ufuncs。 文件在这里。 @stencil - 将函数声明为类似模板操作的内核。 文件在这里。 @jitclass - 对于jit感知类。文件在这里。 @cfunc - 声明一个函数用作本机回调(从C / C ++等调用)。文件在这里。 @overload- 注册您自己的函数实现,以便在nopython模式下使用,例如@overload(scipy.special.j0)。 文件在这里。 一些装饰者提供额外选项:

parallel = True- 启用功能的 自动并行化。 fastmath = True- 为该功能启用快速数学行为。 ctypes / cffi / cython互操作性:

cffi- 模式支持调用CFFI函数nopython。 ctypes- 模式支持调用ctypes包装函数nopython。。 Cython导出的函数是可调用的。 1.1.7.1。GPU目标: Numba可以针对Nvidia CUDA和(实验性)AMD ROC GPU。您可以使用纯Python编写内核,让Numba处理计算和数据移动(或明确地执行此操作)。单击关于CUDA或ROC的 Numba文档 。

示例:接下来我们写一段简单的代码,来计算一下执行时间:

示例1:不使用numba的:

import time

def num():

arr = []

for i in range(10000000):

arr.append(i)

stime = time.time() num() etime = time.time() - stime

print(arr)

print('用时:{}秒'.format(etime)) 示例输出时间:

用时:1.4500024318695068秒

示例2:使用numba @jit

import time from numba import jit

@jit def num():

arr = []

for i in range(10000000):

arr.append(i)

stime = time.time() num() etime = time.time() - stime

print(arr)

print('用时:{}秒'.format(etime)) 示例输出:

用时:0.5530002117156982秒

结论:

上述两个示例代码,一个使用了numba,另一个没有使用numba;可以看出使用numba @jit装饰后,时间明显快了很多倍。

这只是一个简单示例;对于复杂计算提高速度更明显。

Linux下查看icc安装目录,linux icc 安装相关推荐

  1. linux下查看文件及目录个数

    linux下查看文件及目录个数 1.查看当前文件和目录总数(不包括子目录): ls -l | wc -l 2.查看当前目录下文件个数(不包括子目录): ls -l |grep "^-&quo ...

  2. linux下查看文件的权限,Linux下查看文件权限、修改文件权限的方法

    查看权限命令查看目录的相关权限可以采用命令ls -lD,或者直接用ls -la 如 ls -l www.jb51.net  //这里表示查看www.jb51.net目录 修改权限命令 chmod 77 ...

  3. linux 下查看应用版本信息,Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等. 1.# uname -a   (Linux查看版本当前操作系统内核信息) 2.# cat /proc/vers ...

  4. linux各目录的文件大小,Linux下查看文件大小和目录大小以及目录下文件的大小...

    在linux中经常会查看文件大小,通常用的命令du: 该命令详细解释如下: [www@server101 logs]$ du --help 用法:du [选项]... [文件]... 或:du [选项 ...

  5. Linux下查看CPU等基本命令,Linux查看CPU和内存使用情况的常用命令

    1.top top 的全屏对话模式可分为3部分:系统信息栏.命令输入栏.进程列表栏. 第一部分 -- 最上部的 系统信息栏 : 第一行(top): "00:11:04"为系统当前时 ...

  6. linux下查看进度命令,在Linux系统中使用Coreutils Viewer显示命令运行进度

    Coreutils Viewer(cv)是一个简单的程序,它可以用于显示任何核心组件命令(如:cp.mv.dd.tar.gzip.gunzip.cat.grep.fgrep.egrep.cut.sor ...

  7. linux下查看主频和内存,linux 查看内存主频

    SCC(超级计算集群)简介 SCC概述 超级计算集群(Super Computing Cluster,SCC)使用高速RDMA网络互联的CPU以及GPU等异构加速设备,面向高性能计算.人工智能/机器学 ...

  8. linux下查看服务器进程数,linux服务器查看进程数量

    Linux系统的进程是由线程组成的,当然Linux进程下的线程数是不固定的,可以是一个进程,也可以是多个进程. 一.使用命令查看Linux进程的线程数 1.使用top命令,具体用法是 top -H 加 ...

  9. linux下查看用户的权限,Linux命令_用户,权限管理

    没有之一: --help 1. 查看当前用户:whoami whoami该命令用户查看当前系统当前账号的用户名.可通过cat /etc/passwd查看系统用户信息,由于系统管理员通常需要使用多种身份 ...

  10. linux下查看光驱文件夹,LINUX中为什么没有DEV下的光驱设备文件

    一.光驱的软开关: eject -r cdrom,弹开指定光驱设备的仓门,如只有一个光驱,直接用eject就可,如有两个光驱设备根据/dev/下设备文件来指定设备,如我的机器上还有一 台COMBO C ...

最新文章

  1. python3 udp 广播 源码
  2. 选中文字改变默认颜色
  3. R语言较为特殊的一些运算符
  4. Linux根据名称批量杀死进程-pkill
  5. Node.js HTTPS
  6. 怎么快速搜索服务器里的文件,Windows中快速搜索指定文件夹
  7. dotnet 从零开始写一个人工智能 网络模型
  8. JDK 14中更好的NPE消息
  9. 如何使用Docker轻松集成OnlyOffice和NextCloud--快速搭建私有云办公系统/私有云盘/私有OfficeOnline
  10. python for和while的用法区别_详解python while 函数及while和for的区别
  11. 计算广告基本概念入门总结
  12. Tecplot 2018 破解失败怎么办?
  13. python创建简单网站
  14. 从 Quora 的 187 个问题中学习机器学习和 NLP
  15. matlab定义双精度型变量_MATLAB小数(浮点数)类型
  16. 练习- Java顺序结构综合练习三之金融投资收益计算
  17. 构建ubuntu下的JXTA-C开发环境
  18. linux断开其他用户连接,如何Linux中通过命令行注销其他用户ssh连接
  19. 闭环控制[Python]
  20. RTD2172/RTD2171 Type-C转HDMI设计方案|替代RTD2171/RTD2172芯片|GSV2201可完全替代兼容RTD2172/RTD2171

热门文章

  1. 0. 让我尝试说服你开始尝试OCaml
  2. 如何使用NE555产生方波
  3. 基于android的校园服务平台,基于android平台的校园助手软件的设计
  4. 三星手机开不了机了,一直是开机界面但是进不去
  5. mc服务器常用指令_我的世界建造服务器常用指令什么样 常用指令一览
  6. SQLyog下载(学习使用)
  7. 【爬虫学习】Python登录微博并抓取微博热点信息
  8. Python Qt UI设计
  9. Linux云计算面试常见问题三
  10. 【原创】岁月如歌 一款网易歌单生成pdf的软件