1
2 3 4 5 6 7
|
Cython毕竟不是原生的 Python 代码,使用起来还是有诸多不便的。为此,numba 就成了一个功能强大又容易上手的替代选择,是一个用于编译python数组和数值计算函数的编译器,在使用NumPy数组和循环的代码上效果最佳 使用方法:添加装饰器 Jit(just-in-time compiler)即时编译器,在运行时将某些函数编译成二进制代码
☆☆☆☆☆:numba内不能有第三方包
|
1 2
|
使用numpy数组做大量科学计算时 使用for循环时
|
1 2 3 4 5 6 7 8 9 10 11 12 13
|
@jit 对于函数中能够编译的部分转换成机器码,剩余的代码使用Python解释器 Numba 提供的最灵活的装饰器 @njit 与 @jit(nopython=True) 二者等价,将全部代码转换成机器码,无法实现时会报错 @generated_jit 有时需要根据输入变量的类型来决定函数的实现功能 @vectorize 矢量化 @guvectorize 矢量化
装饰器可选参数 parallel = True @jit的自动并行化仅在64位平台上可用。注意需要和nopython=true一起使用,numba的多线程的数量通过全局变量来设置 import numba numba.config.NUMBA_NUM_THREADS=8 全局变量设置多线程数目 cache=True 为了避免每次调用 Python 程序时的编译时间,可以指示 Numba 将函数编译的结果写入基于文件的缓存中,将函数编译完成的结果保存在一个file文件中。 nogil = True 一旦编译完成,就会释放GIL,这样的情况下就可以充分利用多核系统,但是需要注意多线程编程中需要注意的同步、一致性、竞争等情况
|
1 2 3 4 5 6 7 8
|
import numpy import math @jit(nopython=True) def trig(a, b): return math.sin(a**2) * math.exp(b) a = numpy.ones((5,5)) b = numpy.ones((5,5)) trig(a, b)
|
http://numba.pydata.org/numba-doc/latest/user/troubleshoot.html#numba-troubleshooting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
Numba弃用了列表和集合 from numba import njit @njit def foo(x): x.append(10) return x a = [1, 2, 3] foo(a) NumbaDeprecationWarning或 NumbaPendingDeprecationWarning代表Numba弃用 弃用原因(官方解释) 首先回想一下,为了使Numba能够在nopython 模式下编译函数,所有变量必须具有通过类型推断确定的具体类型。在简单的情况下,很明显如何反映内部容器的更改nopython模式返回到原始的Python容器。但是,无法快速有效地将具有嵌套容器类型(例如,整数列表的列表)的复杂数据结构反映出来。经过多年的处理此问题的经验后,很明显,提供此行为既困难又常常导致代码性能不佳(所有反映的数据都必须通过特殊的API才能将数据转换为本地数据格式,然后在返回时返回CPython格式) 禁止弃用警告: from numba.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning import warnings warnings.simplefilter('ignore', category=NumbaDeprecationWarning) warnings.simplefilter('ignore', category=NumbaPendingDeprecationWarning)
|
1 2 3
|
1.普遍的原因是依赖了不受支持的Python功能 2.无法确定函数的返回类型,类型统一失败,if--else中返回的类型不同 3.列表中类型无法推断(列表中的类型要一致)
|
1 2
|
编译JIT函数缓慢的最常见原因是,在nopython模式下编译失败,并且Numba编译器已退回到对象模式。 与常规的Python解释相比,对象模式目前几乎没有提供任何加速,其主要点是允许进行称为循环提升的内部优化 :无论哪种代码包围这些内部循环,此优化都将允许以nopython模式编译内部循环 要确定函数是否成功进行类型推断,可以使用inspect_types() f.inspect_types()
|
1 2 3 4
|
CUDA: 一种通用并行计算架构,架构使GPU能够解决复杂的计算问题.(CPU与GPU"协同处理") CUDA发展历程: GPU越来越强大,GPU为显示图像做了优化之外,在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的,也就是超于游戏,使得GPU能够发挥其强大的运算能力。 CUDA作用: CUDA具有不同于用于CPU编程的传统顺序模型的执行模型。在CUDA中,您编写的代码将同时由多个线程(通常成百上千个)执行 CUDA环境配置: 失败========
|
1 2
|
注意:numba装饰的函数在第一次调用的时候会进行编译,会消耗一些时间,再次调用就不会了 如果函数无法在nopython模式下编译,则会发出警告\报错,并说明编译失败的原因
|