You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分别用Numpy(无Numba)和Numba并行处理数组计算逻辑

并行化实现[a², a*b]计算函数的两种方案

给定需求:接收含两个数值的数组[a, b],返回[a², a*b],以下针对函数内独立的两行计算逻辑,提供两种并行实现方法:

1. 不使用Numba的并行实现

可以利用Python标准库的线程/进程池实现并行,因为两个计算逻辑完全独立,适合拆分任务并行执行。

线程池实现(轻量计算首选)

import numpy as np
from concurrent.futures import ThreadPoolExecutor

def func_parallel_non_numba(array_1):
    a, b = array_1
    
    # 定义独立计算任务
    def calc_square():
        return a ** 2
    def calc_product():
        return a * b
    
    # 并行执行任务
    with ThreadPoolExecutor(max_workers=2) as executor:
        future_square = executor.submit(calc_square)
        future_product = executor.submit(calc_product)
        result = np.array([future_square.result(), future_product.result()])
    return result

# 测试
array_1 = np.array([3., 4.])
print(array_1)
print(func_parallel_non_numba(array_1))

进程池实现(重计算场景可选)

import numpy as np
import multiprocessing as mp

def calc_square(a):
    return a ** 2

def calc_product(a, b):
    return a * b

def func_parallel_non_numba_mp(array_1):
    a, b = array_1
    with mp.Pool(processes=2) as pool:
        res_square = pool.apply_async(calc_square, (a,))
        res_product = pool.apply_async(calc_product, (a, b))
        result = np.array([res_square.get(), res_product.get()])
    return result

# 测试
array_1 = np.array([3., 4.])
print(func_parallel_non_numba_mp(array_1))

2. 使用Numba的并行实现

Numba通过JIT编译结合并行指令,可实现低开销的并行计算,适合数值计算场景。

基于prange的循环并行

import numpy as np
from numba import njit, prange

@njit(parallel=True)
def func_parallel_numba(array_1):
    array_2 = np.zeros_like(array_1)
    # 用prange标记可并行的循环迭代
    for i in prange(2):
        if i == 0:
            array_2[i] = array_1[0] ** 2
        else:
            array_2[i] = array_1[0] * array_1[1]
    return array_2

# 测试
array_1 = np.array([3., 4.])
print(array_1)
print(func_parallel_numba(array_1))

基于vectorize的向量化并行(适合批量处理)

import numpy as np
from numba import vectorize

@vectorize(['float64(float64, float64)'], target='parallel')
def func_vectorize_numba(a, b):
    return a**2, a*b

# 测试单个输入
array_1 = np.array([3., 4.])
print(func_vectorize_numba(array_1[0], array_1[1]))
# 批量测试多组输入
batch_a = np.array([3., 5., 7.])
batch_b = np.array([4., 6., 8.])
print(func_vectorize_numba(batch_a, batch_b))

内容的提问来源于stack exchange,提问作者Sashwat Tanay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:15:47