Python加速库Numba

本文介绍了Numba库,一款能在运行时将Python函数编译为机器码的JIT编译器,尤其适用于提升数组运算的速度。通过示例对比了普通Python函数、使用NumPy的函数及使用Numba装饰器后的函数在执行效率上的差异。

1、Numba库介绍

Numba是一款可以在运行时把python函数编译为机器码的JIT编译器

经过Numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。

普通python语言靠CPython编译的,但是Numba使用Jit编译器可以直接将一个函数转化为机器码。

用于提升数组运算速度。

Numba最初是由开发Anaconda的Continuum Analytics开发的。

2、Numba库的安装

 pip install numba

3、Numba的使用

import numba
import numpy as np
from numba import jit
import time
def sum_matrix(M):
    N1,N2 = M.shape
    result = 0
    for i in range(N1):
        for j in range(N2):
            result+=M[i][j]
def sum_numpy(M):
    return np.sum(M)

def sum_jit(M):
    sum_matrix_jit = jit()(sum_matrix)
    return sum_matrix_jit

def print_run_time(func,M,loops):
    start = time.time()
    for _ in range(loops):
        func(M)
    end = time.time()
    print('current Function [%s] run time is %.2f' % (func.__name__ ,end - start))

if __name__ == '__main__':
    np.random.seed(1234)
    M = np.random.random([int(4e3)]*2)
    loops = 5
    print_run_time(sum_matrix,M,loops)
    print_run_time(sum_numpy,M,loops)
    print_run_time(sum_jit,M,loops)
current Function [sum_matrix] run time is 57.13
current Function [sum_numpy] run time is 0.16
current Function [sum_jit] run time is 0.10

4、使用jit装饰器

@jit(nopython=True) #能获得最佳性能。函数的运行与Python解释器完全无关,不会调用Python的C语言API。

jit转换函数更常用装饰器的写法:

@jit
def sum_matrix_jit(M):
    N1, N2 = M.shape
    result = 0
    for i in range(N1):
        for j in range(N2):
            result += M[i, j]
    return result

针对数值运算的python函数,只需要添加简单的@jit装饰器,就可以让运行速度大幅提升

@jit提供了参数选项,如果在jit的参数中指定了输入输出的类型,可以轻微提升速度

@jit(float64(int32, int32))
def f(x, y):
    return (x + y) / 3.14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值