NumPy 向量操作的并行化
NumPy 是一个强大的 Python 库,用于存储和操作大型多维数组。虽然它比其他类似的集合(如列表)更快、更有效,但我们可以通过使用并行化机制进一步提高其性能。并行化意味着将任务拆分为多个进程以实现一个单一目标。Python 提供了几种并行化 NumPy 向量操作的方法,包括 multiprocessing 和 numexpr 模块。
用于并行化 NumPy 向量操作的 Python 程序
让我们讨论一下并行化 NumPy 向量的方法
使用 multiprocessing
每个 Python 程序都被视为一个单一进程,有时可能需要同时运行多个进程。为此,Python 提供了一个名为 multiprocessing 的模块,该模块有一个名为 'Pool()' 的内置方法,允许同时创建和执行多个任务。
示例
以下示例说明了如何使用并行化和 multiprocessing 来对向量的每个元素进行平方运算。
方法
第一步是导入 NumPy 库,引用名称为 'np',以及 multiprocessing,引用名称为 'mp'。
接下来,创建一个用户定义的方法以及一个参数。
在此方法内部,使用 cpu_count() 确定可用 CPU 进程的数量。此值将进一步用于创建用于并行计算的工作进程池。
然后,使用 Pool 创建一个进程池,该进程池将 'num_processes' 作为参数,指定可用的 CPU 进程数。
现在,使用 map 方法将 square() 方法应用于输入向量的每个元素。此方法会将输入向量分成块,并将每个块分配给一个工作进程进行计算。map 函数会自动将工作负载分配到可用的进程中,并按与输入向量相同的顺序返回结果。
映射完成后,我们将使用 close() 方法关闭池,并使用 join() 方法等待所有工作进程完成。
最后,返回结果,该结果是通过并行计算获得的平方值的列表。
现在,创建一个 NumPy 向量并将其作为参数传递给该方法,并显示结果。
# importing required packages import numpy as np import multiprocessing as mp # user-defined method to print square of vector def square_vector_parallel(vector): num_processes = mp.cpu_count() pool = mp.Pool(processes = num_processes) result = pool.map(np.square, vector) pool.close() pool.join() return result # creating a numpy vector vec_tr = np.array([1, 2, 3, 4, 5]) # calling the method result = square_vector_parallel(vec_tr) # printing the result print(result)
输出
[1, 4, 9, 16, 25]
使用 numexpr
这个 Python 包能够并行化计算并利用多个核心或 SIMD 指令,从而导致 NumPy 向量快速高效地执行。
示例 1
在以下示例中,我们将获取两个 NumPy 向量,并使用 'numexpr' 库对它们执行并行加法运算。
# importing required packages import numpy as np import numexpr as nex # creating two numpy vectors a1 = np.array([5, 2, 7, 4, 5]) a2 = np.array([4, 8, 3, 9, 5]) # printing the result print(nex.evaluate('a1 + a2'))
输出
[ 9 10 10 13 10]
示例 2
这是另一个演示 numexpr 用法的示例。我们将创建一个用户定义的方法,该方法将向量作为参数。在此方法内部,将表达式 expr 定义为 'vector**2',它对输入向量的每个元素进行平方运算,并将其传递给 numexpr 的 'evaluate()' 方法以并行方式计算表达式。
import numpy as np import numexpr as nex # user-defined method to print square of vector def square_vector_parallel(vector): expr = 'vector**2' result = nex.evaluate(expr) return result # creating a numpy vector vec_tr = np.array([4, 8, 6, 9, 5]) # calling the method result = square_vector_parallel(vec_tr) # printing the result print(result)
输出
[16 64 36 81 25]
示例 3
在前面示例的相同代码中,我们使用 'set_num_threads()' 方法显式地将线程数设置为 4。这允许我们在表达式计算中执行线程级并行性。
import numpy as np import numexpr as nex # user-defined method to print square of vector def square_vector_parallel(vector): # Set the number of threads to utilize nex.set_num_threads(4) expr = 'vector**2' result = nex.evaluate(expr) return result # creating a numpy vector vec_tr = np.array([4, 8, 6, 9, 5]) # calling the method result = square_vector_parallel(vec_tr) # printing the result print(result)
输出
[16 64 36 81 25]
结论
在本文中,我们讨论了几个示例程序,以演示如何并行化 NumPy 向量操作。我们使用了两个最流行和广泛使用的 Python 库来进行并发操作,分别名为 multiprocessing 和 numexpr。