Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
容器镜像服务 ACR,镜像仓库100个 不限时长
可观测可视化 Grafana 版,10个用户账号 1个月
简介: Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。

一、Numba模块简介

Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。它特别适用于科学计算、数据分析以及机器学习等需要大量数值计算的任务。Numba可以显著提高这些任务的执行速度,因为它可以将Python代码转换为优化的机器代码。

二、JIT编译

JIT编译是一种在程序运行时将源代码(如Python代码)转换为机器代码的技术。与传统的编译方式不同,JIT编译允许程序在运行时动态地生成和执行优化的机器代码。Numba的jit()函数(在较新版本的Numba中已被njit()jit(nopython=True)替代)就是用于实现这种JIT编译的。

三、vectorize()函数

vectorize()函数是Numba提供的一个装饰器(decorator),用于将Python函数转换为能够处理NumPy数组元素的函数。这样,你就可以对整个数组进行批量操作,而无需显式地编写循环。vectorize()函数可以显著提高处理大型数组时的性能。

四、代码示例与解释

1. 使用jit()(或njit())进行JIT编译

首先,我们来看一个简单的示例,演示如何使用Numba的jit()(或njit())函数对Python函数进行JIT编译。

from numba import njit
import numpy as np

# 定义一个简单的Python函数,用于计算两个数组的和
def add_arrays(a, b):
    c = np.empty_like(a)
    for i in range(a.shape[0]):
        for j in range(a.shape[1]):
            c[i, j] = a[i, j] + b[i, j]
    return c

# 使用njit装饰器对函数进行JIT编译
add_arrays_jit = njit(add_arrays)

# 创建两个随机数组进行测试
a = np.random.rand(1000, 1000)
b = np.random.rand(1000, 1000)

# 调用原始函数和JIT编译后的函数,并比较执行时间
import time
start_time = time.time()
result1 = add_arrays(a, b)
end_time = time.time()
print(f"Original function execution time: {end_time - start_time} seconds")

start_time = time.time()
result2 = add_arrays_jit(a, b)
end_time = time.time()
print(f"JIT compiled function execution time: {end_time - start_time} seconds")

# 验证结果是否相同
assert np.allclose(result1, result2)

解释:

  • 我们首先定义了一个简单的Python函数add_arrays(),用于计算两个二维数组的和。这个函数使用了两个嵌套的for循环来遍历数组的每个元素。
  • 然后,我们使用njit装饰器对add_arrays()函数进行JIT编译,得到一个新的函数add_arrays_jit()。这个新函数在内部使用了Numba的优化技术,可以显著提高执行速度。
  • 接下来,我们创建了两个随机的二维数组ab,并分别调用原始函数和JIT编译后的函数来计算它们的和。我们还记录了每个函数的执行时间,并打印出来。你可以看到,JIT编译后的函数执行速度明显快于原始函数。
  • 最后,我们使用np.allclose()函数来验证两个函数的结果是否相同。由于我们只是对数组进行了简单的加法操作,所以两个函数的结果应该是相同的。

2. 使用vectorize()进行数组操作

接下来,我们来看一个使用vectorize()函数的示例。

```python
from numba import vectorize, float64, int64
import numpy as np

定义一个简单的Python函数,用于计算两个数的平方和

def square_sum(a, b):
return a2 + b2

使用vectorize装饰器将函数转换为能够处理NumPy数组的函数

square_sum_vec = vectorize([float64(float64, float64)])(square_sum)

创建两个NumPy数组进行测试

a = np.array([1, 2, 3, 4], dtype=np.float64
处理结果:

一、Numba模块简介

Numba是一个Python库,用于对Python代码进行即时(JIT)编译,以便在硬件上高效执行。它特别适用于科学计算、数据分析以及机器学习等需要大量数值计算的任务。Numba可以显著提高这些任务的执行速度,因为它可以将Python代码转换为优化的机器代码。

二、JIT编译

JIT编译是一种在程序运行时将源代码(如Python代码)转换为机器代码的技术。与传统的编译方式不同,JIT编译允许程序在运行时动态地生成和执行优化的机器代码。Numba的jit()函数(在较新版本的Numba中已被njit()jit(nopython=True)替代)就是用于实现这种JIT编译的。

三、vectorize()函数

vectorize()函数是Numba提供的一个装饰器(decorator),用于将Python函数转换为能够处理NumPy数组元素的函数。这样,你就可以对整个数组进行批量操作,而无需显式地编写循环。vectorize()函数可以显著提高处理大型数组时的性能。

四、代码示例与解释

1. 使用jit()(或njit())进行JIT编译

首先,我们来看一个简单的示例,演示如何使用Numba的jit()(或njit())函数对Python函数进行JIT编译。
```python

定义一个简单的Python函数,用于计算两个数组的和

c = np.emptylike(a)
for i in range(a.shape[0])

for j in range(a.shape[1])_
c[i, j] = a[i, j] + b[i, j]
return c

使用njit装饰器对函数进行JIT编译

创建两个随机数组进行测试

调用原始函数和JIT编译后的函数,并比较执行时间

start_time = time.time()

验证结果是否相同

  • 我们首先定义了一个简单的Python函数add_arrays(),用于计算两个二维数组的和。这个函数使用了两个嵌套的for循环来遍历数组的每个元素。

    2. 使用vectorize()进行数组操作

    接下来,我们来看一个使用vectorize()函数的示例。
    ```python

    定义一个简单的Python函数,用于计算两个数的平方和

    return a2 + b2

    使用vectorize装饰器将函数转换为能够处理NumPy数组的函数

    创建两个NumPy数组进行测试

相关文章
|
2天前
|
存储 JSON API
Pydantic:目前最流行的Python数据验证库
在处理来自系统外部的数据,如API、终端用户输入或其他来源时,我们必须牢记开发中的一条基本原则:“永远不要相信用户的输入”。 因此,我们必须对这些数据进行严格的检查和验证,确保它们被适当地格式化和标准化。这样做的目的是为了确保这些数据符合我们的程序所需的输入规范,从而保障项目能够正确且高效地运行。
|
1天前
|
开发工具 git Python
通过Python脚本git pull 自动重试拉取代码
通过Python脚本git pull 自动重试拉取代码
81 4
|
3天前
|
对象存储 Python
Python代码解读-理解-定义一个User类的基本写法
以上描述清晰地阐述了如何在Python中定义 `User`类的基本方法以及如何创建和使用该类的实例。这是面向对象编程中的核心概念,是紧密结合抽象和实现,封装数据并提供操作数据的接口。由于用简单通用的语言易于理解,这样的解释对于初学者而言应该是友好且有帮助的。
12 4
|
1天前
|
Shell Python 容器
Python模块是其代码组织和重用的基本方式。
【8月更文挑战第18天】Python模块是其代码组织和重用的基本方式。
6 1
|
3天前
|
存储 缓存 索引
Python中的NumPy库详解
Python中的NumPy库详解
|
5天前
|
存储 网络协议 Python
Python如何用PyModbus库进行Modbus TCP通信
使用python解决工业通信问题是一个非常好的选择,python具有丰富的生态,可以轻松解决工业通信的各种问题。 本篇主要介绍使用pymodbus库进行modbus tcp仿真,实现pc端读取plc或工业设备modbus变量。
|
5天前
|
Python
安装notepad++ 安装Python Python环境变量的数值。怎样在notepad++上运行Python的代码
这篇文章提供了在notepad++上安装和配置Python环境的详细步骤,包括安装Python、配置环境变量、在notepad++中设置Python语言和快捷编译方式,以及解决可能遇到的一些问题。
安装notepad++ 安装Python Python环境变量的数值。怎样在notepad++上运行Python的代码
|
3天前
|
Python
Python生成Thinkphp6代码工具类
Python生成Thinkphp6代码工具类
7 0
|
7天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1