使用Concurrent.Futures的Matlab的Parfor的Python实现(提供了代码示例)

2024-05-03 15:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,我需要将一个Matlab程序翻译成Python,我很难弄清楚如何编写以下循环:

parfor i=1:numPointsEval
     ftemp_pte(:,i) = feval(func_F,pointsToEval(:,i));

我不熟悉使用Python的并行性,到目前为止,我已经成功地编写了该代码的顺序版本(正在工作),以及使用ThreadPoolExecutor的循环版本,我很不确定是否正确使用了该版本。以下提供了两种代码:


def func_F(x):
    f= np.zeros((1,2))
    f[0,0]= x[0,0]
    n= max(np.size(x,0), np.size(x,1))    
    g    = 1 + 9* np.sum(x[1:n])/(n-1)
    h    = 1 - np.sqrt(f[0,0]/g)
    f[0,1] = g * h
    F= np.transpose(f)
    return F

#sequential version
for i in range(0, numPointsEval):
    ftemp_pte[:,i] = np.hstack(func_F(np.vstack(pointsToEval[:,i])))



#ThreadPoolExecutor version
def tempFtemp(ftemp_pte, func_F, i):
    ftemp_pte[:,i] = np.hstack(func_F(np.vstack(pointsToEval[:,i])))
                    
with concurrent.futures.ThreadPoolExecutor() as executor:
    for i in range(0, numPointsEval):
        executor.submit(tempFtemp, ftemp_pte, func_F, i)

因此,我有两个主要问题,非常感谢您的反馈:

1-我使用ThreadPoolExecutor的实现是否正确?我不确定我是否正确使用它,而且并行版本的执行时间高于顺序版本(尽管这可能是因为我的电脑只有2个逻辑内核和2个内核)

2-如何以类似的方式使用ProcessPoolExecutor?我无法显示该部分的代码,因为在过去的两天里,我一直在试图找出如何做,但我似乎无法理解它。我看到的每个示例和教程都只显示了1D数组的示例。变量ftemp_pte[:,i]是我在这里遇到的最大问题,我在一些帖子中也看到,不建议使用hstackvstack,但在本指令中,它们是防止维度不匹配的基础

如果您对这两种并行形式有任何帮助或反馈,我们将不胜感激