首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于循环多处理的Python

用于循环多处理的Python
EN

Stack Overflow用户
提问于 2021-09-15 00:59:52
回答 3查看 60关注 0票数 0

我有一个需要计算的矩阵矩阵(即a x x y x z x z矩阵,我需要对每个z x z矩阵执行计算,所以x*y总操作)。目前,我循环遍历矩阵的前两个维度并执行计算,但它们是完全独立的。有没有一种方法可以并行计算这些矩阵,而不需要事先知道有多少这样的矩阵(即x和y未知)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-15 01:34:31

可以;请参阅multiprocessing模块。下面是一个示例(根据您的用例对文档中的示例进行了调整)。(为了简单起见,我在这里假定使用z = 1,以便f接受一个标量。)

代码语言:javascript
复制
from multiprocessing import Pool

# x = 2, y = 3, z = 1 - needn't be known in advance
matrix = [[1, 2, 3], [4, 5, 6]]

def f(x):
    # Your computation for each z-by-z submatrix goes here.
    return x**2

with Pool() as p:
    flat_results = p.map(f, [x for row in matrix for x in row])
    # If you don't need to preserve the x*y shape of the input matrix,
    # you can use `flat_results` and skip the rest.
    x = len(matrix)
    y = len(matrix[0])
    results = [flat_results[i*y:(i+1)*y] for i in range(x)]

# Now `results` contains `[[1, 4, 9], [16, 25, 36]]`

这将在多个进程之间划分x * y计算(每个CPU核心一个进程;这可以通过向Pool()提供一个参数进行调整)。

根据您正在做的事情,可以考虑首先尝试使用numpy进行向量化操作(而不是for循环);您可能会发现它足够快,不需要多处理。(如果本例中的matrix是一个numpy数组,那么代码就是results = matrix**2。)

票数 1
EN

Stack Overflow用户

发布于 2021-09-15 01:34:38

我在python中处理并行处理的方法是定义一个函数来做我想做的事情,然后使用multiprocessing.Pool.starmap并行应用它。如果不知道你在计算什么以及如何计算,就很难为你的问题建议任何代码。

代码语言:javascript
复制
import multiprocessing as mp

def my_function(matrices_to_compare, matrix_of_matrices):
    m1 = matrices_to_compare[0]
    m2 = matrices_to_compare[1]
    result = m1 - m2 # or whatever you want to do
    return result

matrices_x = <list of x matrices>
matrices_y = <list of y matrices>

matrices_to_compare = list(zip(matrices_x,matrices_y))

with mp.Pool(mp.cpu_count()) as pool:
    results = pool.starmap(my_function,
       [(x, matrix_of_matrices) for x in matrices_to_compare],
                                   chunksize=1)
票数 1
EN

Stack Overflow用户

发布于 2021-09-15 01:40:56

其他答案提出的多处理池方法的替代方案-如果您有可用的图形处理器,最直接的方法可能是使用张量代数包来利用它,例如cupytorch

你还可以通过使用cython或numba对代码进行jit编译(对于cpu)来获得更多的加速(对于gpu编程,还有numba.cuda,但是需要一些背景知识才能使用)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69185976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档