Python 提速大杀器之 numba 篇

本文探讨了 Python 代码慢的原因,如动态变量和解释性语言,并介绍了 numba 这个库如何通过 JIT 技术加速 Python 代码。通过实例展示了 numba 如何加速 for 循环、numpy 运算以及使用 CUDA 支持 GPU 编程。建议在密集计算部分使用 numba 实现加速,并给出了优化 for 循环的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你是不是曾经有这样的苦恼,python 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它。老天啊,有没有什么两全其美的办法呢?俗话说的好:办法总是比困难多,大家都有这个问题,自然也就有大佬来试着解决这个问题,这就请出我们今天的主角: numba


每次一个Python小技巧!

不过在介绍 numba 之前,我们还是得来看看 python 为什么这么慢:

为什么 python 这么慢

用过 python 的人都知道, 尤其是在有循环的情况下,python 会比 C++ 慢很多,所以很多人都避免在 python 代码里引入复杂的 for 循环。我们可以想想 python 和 C++ 写起来有哪些区别呢:

动态变量

如果你写过 C/C++ 就会发现,我们需要对变量类型有严格的定义,我们需要定义变量的类型是 int 或者 float 之类的。但是 python 就不一样了,写过的 python 的人都知道,它去掉了变量申明和数据类型。也就是说,无论啥数据,咱啥都不用管,想存就存!那么 python 是如何做到这样洒脱自由的呢?这就不得不提 python 中万物皆是对象了,真正的数据是存在对象里面的。对于一个简单的两个变量的加法,python 每次在做运算的时候都得先判断变量的类型,再取出来进行运算,而对于 C 来说,简单的内存读写和机器指令 ADD 即可。其实在 C/C++ 中也有可变数据类型,但是其声明是非常复杂的,是一种非常令人头疼的结构。

解释性语言

C/C++ 这类编译性语言最大的好处就是其编译过程是发生在运行之前的,源代码在调用前被编译器转换为可执行机器码,这样就节约了大量的时间。而 python 作为一种解释性语言,没法做到一次编译,后续可以直接运行,每次运行的时候都要重新将源代码通过解释器转化为机器码。这样一个好处就是非常容易 debug( 这里要再次感叹一下 python 真不愧是新手友好型语言~), 当然,这个问题自然也是有尝试解决的办法,一个很重要的技术就是 JIT (Just-in-time compilation):JIT 即时编译技术是在运行时(runtime)将调用的函数或程序段编译成机器码载入内存,以加快程序的执行。说白了,就是在第一遍执行一段代码前,先执行编译动作,然后执行编译后的代码。

上面只是简单列出了两点,当然还有更多的原因,限于篇幅就不再具体介绍,而我们开篇提到的 numba 就是通过 JIT 加速了 python 代码。那么怎么使用 numba 加速我们的代码呢?我们可以看一些简单的例子:

numba 加速 python 的小例子

用 numba 加速 python 代码多简单方便呢,我们先来看看如何使用 numba 加速 python 代码:

如果让你用单纯的 python 计算一个矩阵所有元素的和,很容易可以写出下面的代码:

def cal_sum(a): 
    result = 0 
    for i in range(a.shape[0]): 
        for j in range(a.shape[1]): 
            result += a[i, j] 
    return result 

当需要计算的矩阵很小的时候,貌似速度也不慢,可以接受,但是如果输入的矩阵大小为 (500, 500),

a = np.random.random((500, 500)) 
%timeit cal_sum(a) 

输出结果为:

47.8 ms ± 499 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) 

我们尝试加上 numba:

import numba  
 
@numba.jit(nopython=True) 
def cal_sum(a): 
    result = 0 
    for i in range(a.shape[0]): 
        for j in range(a.shape[1]): 
            result += a[i, j] 
    return result 

输入同样大小的矩阵

a = np.random.random((500, 500)) 
%timeit cal_sum(a) 

输出结果为:

236 µs ± 545 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

注意在这里我们使用了 %itemit 测试运行时间(原因我们留到后面说),通过对比两个时间,我们可以发现通过 numba 获得了非常明显的加速效果!

<think>好的,用户想查询Numba的版本信息或安装特定版本的方法。我需要先回顾之前的引用内容。在引用[1]中,用户尝试安装Numba时遇到了问题,特别是安装llvmlite时出错。引用[2]提到了Numba的安装和使用,包括CUDA的支持。用户现在需要知道如何查看可用版本以及如何安装指定版本。 首先,我应该解释如何查看Numba的版本列表。通常,可以通过PyPI来查看所有发布的版本,但用户可能需要具体的命令。使用pip search虽然曾经可行,但现在可能被禁用,所以建议使用pip index versions或者直接访问PyPI页面。 其次,安装指定版本的方法应该是使用pip install numba==版本号,同时需要注意依赖项,尤其是llvmlite的兼容版本。因为引用[1]中安装失败可能与llvmlite的版本不匹配有关,所以必须提醒用户安装对应版本的llvmlite。例如,如果用户安装Numba 0.46.0,需要llvmlite>=0.30.0dev0,这时候可能需要指定llvmlite的版本。 另外,用户可能遇到安装失败的情况,比如编译错误,这时候建议使用预编译的二进制包,添加--prefer-binary参数,或者换用conda安装,因为conda可能更好地处理依赖关系。 最后,需要生成相关问题,可能涉及版本查询、安装问题解决、依赖管理以及版本兼容性等。确保回答结构清晰,步骤明确,帮助用户逐步解决问题,并引用之前的错误案例作为参考,提醒他们注意兼容性问题。</think>### Numba版本查询与安装方法 ### 一、查询Numba版本列表 1. **通过PyPI官方页面查看** 访问[Numba的PyPI页面](https://pypi.org/project/numba/#history),可直接查看所有历史版本列表[^1]。 2. **使用`pip`命令查询** 执行以下命令列出所有可用版本(需确保网络畅通): ```bash pip index versions numba ``` 若提示`pip index`不可用,可尝试: ```bash pip install numba==invalid_version 2>&1 | grep 'from versions' ``` ### 二、安装指定版本Numba 1. **基础安装命令** 使用以下命令安装特定版本(以0.56.4为例): ```bash pip install numba==0.56.4 ``` 2. **处理依赖兼容性** Numba对`llvmlite`有严格版本要求。例如安装Numba 0.56.4时需配合llvmlite 0.39.1: ```bash pip install llvmlite==0.39.1 numba==0.56.4 ``` 3. **使用二进制预编译包** 若安装失败(如出现编译错误),可强制使用预编译二进制: ```bash pip install numba==0.56.4 --prefer-binary ``` 4. **通过conda安装** 若使用Anaconda环境: ```bash conda install numba=0.56.4 ``` ### 三、版本兼容性说明 | Numba版本 | 最低llvmlite版本 | Python支持范围 | CUDA支持 | |------------|------------------|----------------|------------------| | 0.56.x | 0.39.0 | 3.7-3.10 | CUDA 11.0-11.7 | | 0.55.x | 0.38.0 | 3.7-3.10 | CUDA 10.2-11.6 | | 0.54.x | 0.37.0 | 3.7-3.9 | CUDA 10.2-11.5 | ### 四、验证安装 ```python import numba print(numba.__version__) # 应输出安装的版本号 ``` ### 典型问题解决方案 - **错误`llvmlite版本不匹配`**:参考引用[1]中安装日志,需手动指定兼容的llvmlite版本 - **CUDA支持缺失**:确保安装时包含CUDA工具包,使用`numba -s`查看CUDA检测状态[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值