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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测监控 Prometheus 版,每月50GB免费额度
简介: 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数组进行测试

相关文章
|
19小时前
|
Python
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
11 3
|
1天前
|
缓存 测试技术 开发者
探索Python中的装饰器:提升代码的灵活性和可维护性
在Python编程中,装饰器是一种强大且灵活的工具,它允许开发者在不修改现有代码的基础上,为函数或类添加额外的功能。本文将深入探讨装饰器的定义、使用场景以及如何创建自定义装饰器。通过实用的示例,我们将展示如何利用装饰器来增强代码的可重用性和可读性。
|
1天前
|
小程序 iOS开发 MacOS
将Python代码转化为可执行的程序
将Python代码转化为可执行的程序
10 1
|
1天前
|
Rust 监控 编译器
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
12 2
|
1天前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
49 0
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
1天前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
7 0
|
1天前
|
开发者 Python
Python 时间处理与时区转换:深入探究 datetime、time 模块与 pytz 库的功能与应用
Python 时间处理与时区转换:深入探究 datetime、time 模块与 pytz 库的功能与应用
5 0
|
1天前
|
存储 自然语言处理 编译器
Python 源文件编译之后会得到什么,它的结构是怎样的?和字节码又有什么联系?
Python 源文件编译之后会得到什么,它的结构是怎样的?和字节码又有什么联系?
17 0
|
存储 Python
Python必知词汇:硬件
硬件是电脑的物理设备,是指计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称。这些物理装置按系统结构的要求构成一个有机整体,为计算机软件运行提供物质基础。
334 0
|
23小时前
|
iOS开发 MacOS Python
Python 编程案例:谁没交论文?输出并生成电子表格
Python 编程案例:谁没交论文?输出并生成电子表格
16 9