<<返回python首页 python

《Python 应用案例》

提升python速度的利器:Numba

提升python速度的利器:Numba

python由于它动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。

办法永远比困难多,Numba就是解决python慢的一大利器,可以让python的运行速度提升上百倍!

什么是Numba?

Numba是一款可以将python函数编译为机器代码的JIT编译器,经过Numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。

python之所以慢,是因为它是靠CPython编译的,Numba的作用是给python换一种编译器。

Numba适合科学计算

numpy是为面向numpy数组的计算任务而设计的。

在面向数组的计算任务中,数据并行性对于像GPU这样的加速器是很自然的。Numba了解NumPy数组类型,并使用它们生成高效的编译代码,用于在GPU或多核CPU上执行。特殊装饰器还可以创建函数,像numpy函数那样在numpy数组上广播。

什么情况下使用Numba呢?

  • 使用numpy数组做大量科学计算时
  • 使用for循环时

使用Numba非常简单,只需要将Numba装饰器应用到python函数中,无需改动原本的python代码,Numba会自动完成剩余的工作。

实验:numba对比numpy

安装Numba

在一台新机器上安装安装Numba共四步。

更新源

!apt update -y

安装llvm-10

!apt install llvm-10 -y

进行环境变量配置,并生效环境变量

复制以下命令在右侧ssh窗口运行

echo 'export LLVM_CONFIG=/usr/bin/llvm-config-10' >> ~/.bashrc
source ~/.bashrc

使用pip3安装numba

!pip3 install numba -i https://pypi.tuna.tsinghua.edu.cn/simple

传入Numba装饰器jit,对编写的函数进行装饰

import numpy as np
import numba
from numba import jit
import random

@jit(nopython=True)
def monte_carlo_pi(nsamples):
    acc = 0
    for i in range(nsamples):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            acc += 1
    return 4.0 * acc / nsamples

nopython = True选项要求完全编译该函数(以便完全删除Python解释器调用),否则会引发异常。这些异常通常表示函数中需要修改的位置,以实现优于Python的性能。强烈建议您始终使用nopython = True。

跑10轮,每轮执行1000次该函数

%%timeit -n 1000 -r 10
monte_carlo_pi(1000)

不经Numba加速的函数执行时间的对比

import random
def monte_carlo_pi_none_numba(nsamples):
    acc = 0
    for i in range(nsamples):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            acc += 1
    return 4.0 * acc / nsamples
%%timeit -n 1000 -r 10
monte_carlo_pi_none_numba(1000)

两者对比,速度从500ms左右,提升到50ms左右。约10倍的速度提升。

实验:numba对比Python函数

前面已经对比了Numba使用前后,python代码速度提升了40倍,但这还不是最快的。

这次,我们不使用numpy数组,仅用for循环,看看nunba对for循环到底有多钟爱!

# 不使用numba进行加速的
def t_none_numba():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%%time
t_none_numba()
# 使用Numba的情况
import numba
from numba import jit

@jit(nopython=True)
def t():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%%time
t()

使用Numba后速度的提升从3ms左右,提升到3µs左右,是从ms到µs量级的提升!

结语

Numba对python代码运行速度有巨大的提升,这极大的促进了大数据时代的python数据分析能力,对数据科学工作者来说,这真是一个lucky tool !

移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏