python: numba提升程序效率

numba是一个即时编译器,能将Python函数转换为优化的机器码,提高运行速度。通过简单地装饰Python函数,无需额外编译步骤,即可实现接近C或FORTRAN的执行效率。文中通过矩阵连乘和矩阵累加两个实例展示了numba带来的效率提升,分别提升了约3倍和1-2倍。
摘要由CSDN通过智能技术生成

简介

是什么
numba是一个的即时编译器(just-in-time compiler)。即它能在程序运行时,使用LLVM编译器库将Python函数转换为优化的机器码。从而使得运行速度可以达到C或FORTRAN的速度。

怎么用
只需用numba去修饰python函数即可。换言之,不需要替换Python解释器、运行单独的编译步骤、安装C/ c++编译器等额外操作。

实例1

问题描述
对于矩阵连乘: U n . . . U 2 U 1 ρ U_n...U_2U_1\rho Un...U2U1ρ, 原方法是用for循环累乘.测试下用numba.jit修饰后效率是否有提升.

使用注意: array的数据类型必须一样,否则会报错.

实例代码

def f(U, rho):
    for i in range(len(U)):
        rho = np.dot(U[i] ,rho)
        
@numba.jit(nopython=True)        
def f_jit(U, rho):
    for i in range(len(U)):
        rho = np.dot(U[i] ,rho)

a = np.array([[0.1,0.2],[0.3,0.4]])
U = np.array([a]*500)
rho = np.array([[0.5,0.5],[0.5,0.5]])
%timeit f(gates, rho)
%timeit f_jit(gates, rho)

结果分析
对这个测试实例,提升近3倍.

114 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
38.6 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

实例2

问题描述: 矩阵累加,测试用numba后,是否有效率提升.

实例代码

def f(A):
    C = 0
    for a in A:
        C = C + a
    return C

@numba.jit(nopython=True)
def f_jit(A):
    C = np.zeros(A[0].shape,dtype=A.dtype)
    for a in A:
        C = C + a
    return C

A=[]
for i in range(1000):
    a = np.random.uniform(-1,1,(16,16))
    A.append(a)
A = np.asarray(A)
%timeit f(A)
%timeit f_jit(A)

结果分析
对这个测试实例,提升1-2倍

2.81 ms ± 44.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.05 ms ± 38 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值